對指標,陣列以及指標和陣列的總結
對指標,陣列以及指標和陣列的總結
一級指標
二級指標
指標和陣列
指標陣列
首先先談談指標
指標(指標變數):指標是一個變數,裡面存放的是地址;
(在32位平臺下,指標佔4個位元組;在64位平臺下,指標佔8個位元組;)
指標型別:有字元指標,整形指標,浮點指標,陣列指標等
1.指標型別的意義在於進行+1操作時所跳轉的步長,整形指標+1,跳轉4個位元組,字元指標+1,跳轉1個位元組;
2.指標解引用所訪問的許可權(是整型還是字元型);
一級指標
程式碼
int main()
{
int a[5]={1,2,3,4,5};
int *p;//*代表p是一個指標,指向int型別
p=a;
printf("%p\n",p);
printf("%p\n",p+1);
printf("%d\n",*p);
printf("%d\n",*(p+1));
return 0;
}
int * 代表定以一個整形指標,變數名為p ,將陣列a的首地址賦值給p ,輸出 p ,p+1 發現指標加1,跳轉的是 4個位元組,指標解引用 訪問的是陣列的第一個元素,+1再解引用,訪問的是陣列的第二個元素
二級指標
二級指標存放的的一級指標的地址
int a=0;
int *p=&a;//一級指標存放整形a的地址
int **pp=&p;//二級指標,第一個*代表pp是指向int*型別的,第二個*代表pp是指標型別的
程式碼
int main()
{
int a = 10;
int *p=&a;
int **pp = &p;
int ***ppp= &pp;
*p = 10;
printf("a =%d,*p =%d,%d,%d\n",a, *p, **pp, ***ppp);
return 0;
}
面執行結果可知,二級指標,三級指標都可以訪問變數a
ppp進行 解引用
* ppp=pp;
*pp=p;
*p=a ;
***ppp=**pp=*p=a;
二級指標的運用,通常用於指標陣列的傳參
void fun(char **p)
{
}
int main()
{
char *p[] = { "abc","bcd","cdf" };
fun(p);
return 0;
}
指標和陣列
陣列:相同型別元素的集合
雖然陣列名代表首元素的地址,但是陣列名不是指標,陣列和指標沒關係,雖然在有些些方面,陣列和指標在用法上面是一樣的;
陣列和指標都是單獨的型別;
int main()
{
int a[5]={1,2,3,4,5};
int *p;//*代表p是一個指標,指向int型別
int i=0
p=a;
for(i=0;i<sizeof(a)/sizeof(a[0]);i++)
{
printf("%d ",a[i]);
printf("%d ",*(a+1));
printf("%d ",p[i]);
printf("%d ",*(p+1));
}
printf("\n");
return 0;
}
上面的程式碼都可以輸出陣列元素,以上陣列和指標用法相似;
說到數值和指標,要考慮陣列傳參問題
在函式呼叫時,以陣列為引數:
所有的陣列在傳參的時,都要進行降維(退化,要降維成指向陣列內部元素型別的指標;陣列傳參只有第一個維度可以省略,剩下的都不可以
void fun1(int *arr1,int sz)//arr1指向整形
{
}
void fun2(int (*arr2)[3],int sz)//arr2 陣列指標,指向一個長度為3的一維陣列
{
}
void fun3(char **p;int sz)//指向一個char*型別的指標
{
}
int main()
{
int arr1[5]={1,2,3,4,5};
int arr2[2][3]={1,2,3,4,5,6};
char *p[]={"hahaha","wo","li","hai","bu"};//存放的是字串的首地址
fun1(arr1,sizeof(arr1)/sizeof(arr1[0]));
fun2(arr2,sizeof(arr2)/sizeof(arr2[0]));
fun3(p,sizeof(p)/sizeof(p[0]));
return 0;
}
陣列名其實代表的是陣列首元素的地址,但其實陣列名是一個指標常量,不可以被修改
**上面有一個數組 p,由“*“修飾,這個陣列是指標陣列 **
指標陣列
首先,指標陣列是一個數組,裡面存放的是地址;
int *arr[5];
arr是一個數組,裡面存放的每個元素都是整形指標;
###陣列名
在上文中多次提到,陣列名就是首元素地址,這是一般情況
1.sizeof(arr)->arr代表整個陣列
2.&arr->代表整個陣列
int main()
{
int arr[10]={0};
printf("%p\n",arr);
printf("%p\n",arr+1);
printf("%p\n",&arr);
printf("%p\n",&arr+1);
return 0;
}
arr+1 跳轉四個位元組, &arr+1跳轉40個位元組,代表&arr代表整個陣列