1. 程式人生 > >對指標,陣列以及指標和陣列的總結

對指標,陣列以及指標和陣列的總結

對指標,陣列以及指標和陣列的總結

一級指標

二級指標

指標和陣列

指標陣列

首先先談談指標

指標(指標變數):指標是一個變數,裡面存放的是地址;

(在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代表整個陣列