乙個關於陣列名的例題

2021-10-07 12:02:58 字數 3172 閱讀 8722

原題:

//#include

//int main()//

;//// int *p1 =

(int*)

(&array + 1)

;// int *p2 =

(int*)

(array + 1)

;// char *p3 = null;

//// int a = p1[-2] + *p2 + sizeof(

&array) + sizeof(*p3)

;// printf(

"%d ", a)

;// return 0;

//}//輸出:11

其中部分疑問?

//#include

//int main()//

;//// int *p1 =

(int*)

(&array + 1)

;// int *p2 =

(int*)

(array + 1)

;// char *p3 = null;

//// int a = p1[-2] + *p2 + sizeof(

&array) + sizeof(*p3)

;// printf(

"%d ", a);//

// //printf(

"%d ", *p3)

;//這行**如果執行一定會出錯

// //原因*p3為null

// //問題

// //為什麼上面的 int b = p1[-2] + *p2 + sizeof(

&array) + sizeof(*p3)

;可以執行

// // sizeof(*p3) 對於*p3進行解引用了,為什麼沒有報錯 ?

// return 0;

//}

解析過程:

//1.解析陣列名

//#include

我們向對於陣列進行列印

陣列首位址 陣列中有效元素個數

//void printarray(int array[

], int size)

void printarray(int* array, int size)

兩種方式都可以

//// printf(

"\n");

//}//int main()//

;//// int *p1 =

(int*)

(&array + 1)

;// int *p2 =

(int*)

(array + 1)

;// char *p3 = null;

//// int a = p1[-2] + *p2 + sizeof(

&array) + sizeof(*p3)

;//

// printf(

"%d ", a);//

// //在傳參期間陣列名已經退化為首元素的位址

// printarray(array, sizeof(array) / sizeof(array[0]));

// return 0;

//}//陣列名字在兩種情況下才代表陣列本身--即該段連續的空間

//1.對陣列進行取位址

//2.陣列名出現在sizeof之後

//其餘陣列名表示首元素的位址

//比如:函式傳參--》int*

//int* p1 = array;

//int* p2 = array + 1;

//int* p3 =

&array[0]

;//這三種情況下是等價的

//2.分析其中情況

#include

int main();

int *p1 =

(int*)

(&array + 1)

; //&array對於陣列名直接取位址---》陣列本身

//&array + 1:相當於跳過這個陣列

//位置在:

// 丨

// int *p2 =

(int*)

(array + 1)

; //array相當於陣列首元素位址

//array+1相當於陣列第二個

//位置在:

// 丨

// char *p3 = null;

//p3指向的是null

//這個指標是一定不可以解引用的

//解引用必須要看這個空間放的是什麼值

int a = p1[-2] + *p2 + sizeof(

&array) + sizeof(*p3)

; //p1[-2]

//延申:

//int* p = array;

//array[2]

= *(array + 2)

= *(p+2)

;//這三個是相等的

//p1[-2]

=*(p1-2)//兩個等價

//p1[-2]相當於向後移動了兩個位置--》4

//*p2

//對這個指標p2進行解引用就是--》2

//sizeof(

&array)

//sizeof(array)代表:這個陣列佔的總的位元組數

//sizeof(array)

=5*sizeof(int)= 20

//sizeof(

&array)這個就是乙個指標

//指標在32位平台下佔了4個位元組

//因此sizeof(

&array)

=4 //sizeof(*p3)

//疑問:p3是空指標,在sizeof後解引用程式為什麼沒有崩潰?

//答:sizeof在計算表示式時,不會對這個指標進行解引用的

// sizeof後面跟的是型別

//sizeof(*p3)相當於sizeof(char)

//char只佔了乙個位元組

//因此:sizeof(*p3)=1

printf(

"%d ", a)

;//4+2+4+1=11

return 0;

}

萌新一枚,請多多指教。

關於陣列名

陣列名一般可以當指標來用,但是有兩種情況例外。int arr 5 printf d n arr 列印出1 void func int a func arr 作為int 的指標用 void func1 int a,int size func arr,5 將這個陣列做函式實參時,其實就是陣列名做int ...

c c 關於陣列名的討論

指標是c c 語言的特色,而陣列名與指標有太多的相似,甚至很多時候,陣列名可以作為指標使用。於是乎,很多程式設計者就被搞糊塗了。而許多的大學老師,他們在c語言的教學過程中也錯誤得給學生講解 陣列名就是指標 很幸運,我的大學老師就是其中之一。時至今日,我日復一日地進行著c c 專案的開發,而身邊還一直...

陣列名和陣列名的取址

關於陣列名和指標的區別 推薦看這兩篇文章 示例 char a 3 輸出10進製位址 輸出 a 為 2686777 a 為 2686777 a是陣列名,編譯器處理時相當於陣列首元素的位址 a是乙個指向陣列的指標,值為陣列的位址,等於陣列首元素的位址 輸出 a 為 1 a 為 1 a 為 2686777...