原題:
//#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...