二維陣列數和指標操作的理解

2021-07-29 19:29:31 字數 3737 閱讀 6576

#include#include int main(void)

,,, };

char *p[5] = ;//字串指標陣列

int c[4] = ;

int *ptr = c;

/* 這個正確,說明a[0]是乙個位址,而且只指向乙個int型別;

也說明它是一維陣列(這個陣列有兩個元素,即2和4)的首元素(這裡是2)的位址;

+1會加上4個位元組,即乙個int型別的大小;

*/ int *p1 = a[0];

//int (*p2)[2] = a[0];//error

/*這個正確,說明&a[0]是乙個位址,而且指向乙個包含兩個int元素的陣列;

也說明它是陣列(這個陣列有4個元素,分別,,,)首元素(這裡是)的位址;

+1會加上8個位元組,即兩個int型別的大小;

*/ int(*p3)[2] = &a[0];//表示的是該指標指向陣列,而陣列裡面有[?]個元素

int(*p4)[2] = a;//這個說明&a[0]和a性質是一樣的。

//int (*p5)[8] = &a;//error

//int (*p6)[4] = &a;//error

//int* p7 = &a;//怎樣指向整個陣列?

int* p8 = (int*)a;//這樣就達到了對整個陣列的訪問,這種訪問方式和訪問一維陣列無異。

printf("陣列名操作:\n");

printf("1------------\n");//這些位址是一樣的

printf("%p\n", a);

printf("%p\n", &a[0]);

printf("%p\n", a[0]);

printf("%p\n", &a);

printf("2------------\n");//a,&a[0]

printf("%p\n", a + 1);//a表示陣列(退化為1維陣列,看做有4個元素)的首元素位址,這裡的元素指,+1會加上8個位元組

printf("%p\n", &a[0] + 1);//這裡&a[0]和a的性質一樣

printf("%p\n", &a[1][0]);

printf("3------------\n");//a[0]

printf("%p\n", a[0] + 1);//這裡a[0]表示一維陣列(這個陣列有兩個元素,即2和4)的首元素的位址,+1會加上4個位元組

printf("%p\n", &a[0][1]);

printf("4------------\n");//&a

printf("%p\n", &a + 1);//這裡&a表示整個陣列的首位址,+1會加上8*4=32個位元組

printf("5------------\n");

printf("%d\n", a[0]); //a[0]為啥不是a[0][0]的值?因為它僅是指標,是a[0][0]的位址

printf("%d\n", *a[0]);//*a[0]表示的是a[0][0]

printf("%d\n", **a); //*a表示a[0](因為從前面可知a表示&a[0]),**a表示a[0][0]

printf("%d\n", a[0][0]);

printf("\n指標操作:\n");

printf("%p\n", p1 + 1);//和3一樣

printf("%p\n", p3 + 1);//和2一樣

printf("%p\n", p4 + 1);//和2一樣

//char *p[5] = ;//字串指標陣列

printf("\n字串指標陣列操作:\n");

/*首先明確這裡的p和&p[0]性質一樣,則*p即為p[0];

p+1即為&p[0]+1,也就是&p[1],則*(p+1)即為p[1];

&p[0]可以看做是乙個指向乙個陣列的指標,+1要加上整個陣列的大小。

*/ printf("p = %s\n", p); //亂碼

printf("*p = %s\n", *p); //"acvsadf"

printf("(*p)+1 = %s\n", (*p) + 1);//"cvsadf",*p即為p[0],p[0]是指向char型別的指標,因此+1是移動乙個char長度單位

printf("p[0]+1 = %s\n", p[0]+1); //"cvsadf",和上面乙個應該一樣

printf("*(p+1)+1 = %s\n", *(p+1)+1);//「werqwenn」

printf("*(p + 1) = %s\n", *(p + 1));//「cwerqwenn」,注意這裡是乙個指標,因此是%s列印

printf("**(p + 1) = %c\n", **(p + 1)); //『c』,注意這裡已經是完全解引用了,因此是%c列印得到乙個字元

printf("*(p[1] + 1) = %c\n", *(p[1] + 1)); //『w』

printf("*(*(p + 1) + 1) = %c\n", *(*(p + 1) + 1));//'w',注意這裡已經是完全解引用了,因此是%c列印得到乙個字元

/* int c[4] = ;

int *ptr = c;

*/ printf("\n一維陣列的操作:\n");

printf("1-------------\n");//位址都一樣

printf("&c = %p\n", &c);

printf("c = %p\n", c);

printf("&c[0] = %p\n", &c[0]);

printf("2-------------\n");

printf("&c = %d\n", &c);

printf("c = %d\n", c);

printf("&c[0] = %d\n", &c[0]);

printf("3-------------\n");

printf("&c+1 = %p\n", &c+1);//&c表示整個陣列的開始位址,+1的話,會跨越整個陣列

printf("c+1 = %p\n", c+1);//c和&c[0]性質一樣,都表示首元素的位址

printf("&c[0]+1 = %p\n", &c[0]+1);//後兩個應該一樣

綜上記憶為:統一性,即首字母和「&首元素」意義是一樣的。

對於int c[4],c和&c[0]是一樣的;

對於int a[4][2],a和&a[0]是一樣的;

對於char* p[5],p和&p[0]是一樣的。

二維陣列 二維陣列和指標

include using namespace std int main 如上面這段程式所示,通過取位址符 指標 p 獲得了變數 a 的位址,那麼解引用符 就可以從 p 中得到變數 a 的值。也就是說,p a和 p a是等價的。p 是變數 a 的位址,從 p 中就可以取出 a 的值。反之,能從 p ...

關於二維陣列和二維指標的理解總結

二維陣列和二維指標有很多相似也有很多不同 相同點是他們都可以通過位址去取資料,不同點是 首先二維陣列本身儲存資料,二維指標需要指向別的資料才有用。其次陣列的指標是不可變的,指標是可變的。例 比如上面的二維陣列 a是位址,相當於 int p 3 4 a,單位為 int 3 4 sizeof a 4 而...

二維指標和二維陣列

二維指標和二維陣列有三種形式 1,type ptr 2,type ptr或者type prt 3,type prt 三種形式意思相近,也有區別。首先三種形式都能表示二維的資料結構。1,type ptr 表示乙個指向指標的指標 但是在一開始宣告的時候 type ptr ptr到底指向幾個指標是不知道的...