#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到底指向幾個指標是不知道的...