C語(yǔ)言21 指針數(shù)組與數(shù)組指針

C語(yǔ)言21 指針數(shù)組與數(shù)組指針

指針數(shù)組的定義

char arr[10]; //10 char
char* arr[10]; //10 指針(char*)
Point* arr[10]; //10 指針(Point*)
int******** arr[10]; 

指針數(shù)組的賦值

char* a = "Hello";
char* b = "World";

//方式1:
char* arr[2]= {a,b};

//方式2:
char* arr[2];
arr[0]=a;
arr[1]=b;

結(jié)構(gòu)體指針數(shù)組

struct Point
{
    int x;
    int y;
}
Point p;            //8字節(jié) 一個(gè)結(jié)構(gòu)體
Point arr[10];      //8字節(jié) * 10 結(jié)構(gòu)體數(shù)組
Point* arrPoint[10];  //4字節(jié) * 10 結(jié)構(gòu)體指針數(shù)組

分析下面的代碼

int arr[] = {1,2,3,4,5,6,7,8,9,0};
int* p =&arr[0]; //數(shù)組首個(gè)元素地址
int* p = arr;    //數(shù)組首個(gè)元素地址 跟上面的表達(dá)方式是一樣的 也可以說(shuō)是簡(jiǎn)寫(xiě)形式
int* p =&arr;    //什么情況? --編譯失敗 (int(*)[10] 類(lèi)型 不可以轉(zhuǎn)換為 int* 類(lèi)型)

//我們使用顯式聲明類(lèi)型來(lái)躲避編譯器檢查

int* x = (int*)&arr;

//我們編譯后發(fā)現(xiàn) 此時(shí)的x 值和上面的p值是一樣的

//那么區(qū)別是什么呢
//當(dāng)我們使用&arr 獲得的類(lèi)型就是 int(*)[10] 類(lèi)型 也就是數(shù)組指針類(lèi)型

數(shù)組指針的定義

//定義數(shù)組指針的寫(xiě)法

int(*px)[5];//一維數(shù)組指針  px 這里就是當(dāng)前指針的名字
char(*px)[3];  //px 就是指針的名字

int(*px)[2][2]; //二維數(shù)組指針  px 就是指針的名字

char(*px)[3][3][3]; //三維數(shù)組指針  px 就是指針的名字

//思考:
//int *p[5] 與 int(*p)[5] 有什么區(qū)別?

數(shù)組指針的寬度與賦值

int(*px1)p[5];      //一維數(shù)組指針
char(*px2)[3];      
int(*px3)[2][2];        //二維數(shù)組指針
char(*px4)[3][3][3];    //三維數(shù)組指針

printf("%d %d %d %d\n",sizeof(px1),sizeof(px2),sizeof(px3),sizeof(px4));
// 4 4 4 4 
px1 = (int (*)[5])1;
px2 = (char (*)[3])2;
px3 = (int (*)[2][2])3;
px4 = (char (*)[3][3][3])4;

數(shù)組指針的運(yùn)算

int(*px1)p[5];      //一維數(shù)組指針
char(*px2)[3];      
int(*px3)[2][2];        //二維數(shù)組指針
char(*px4)[3][3][3];    //三維數(shù)組指針

px1 = (int (*)[5])1;
px2 = (char (*)[3])1;
px3 = (int (*)[2][2])1;
px4 = (char (*)[3][3][3])1;

px1++;  //int(4) *5  +20 =21
px2++;  //char(1) *3   +3 =4
px3++;  //int(4) *2 *2  +16 =17
px4++;  //char(1) *3 *3 *3 +9 =10

printf("%d %d %d %d \n",px1,px2,px3,px4);

數(shù)組指針的使用

//第一種:
int arr[] = {1,2,3,4,5,6,7,8,9,0}
int(*px)[10]=&arr
//*px 是啥類(lèi)型? => int[10] 數(shù)組類(lèi)型
//px[0] 等價(jià)于 *px 所以 *px 也等于 int[10]數(shù)組
printf("%d %d \n",(*px)[0],px[0][0]);

px++; //后 (*px)[0]就訪(fǎng)問(wèn)整個(gè)數(shù)組地址后的地址內(nèi)的數(shù)據(jù)


//第二種:
int arr[3][3] = {
    {1,2,3},
    {4,5,6},
    {7,8,9}
};

//此時(shí)的 px指針 指向的 {1,2,3}這個(gè)數(shù)組的首地址
int(*px)[3] = &arr[0]; 

// *px -> 此時(shí)就是數(shù)組{1,2,3}本身

//越過(guò)第一個(gè)數(shù)組 此時(shí)px指針指向 {4,5,6}的首地址
px++; 

printf("%d %d \n",(*px)[0],px[0][0]);
//這里打印的就是 4 4

二維數(shù)組指針可以訪(fǎng)問(wèn)一維數(shù)組嗎?

int arr[] = {1,2,3,4,5,6,7,8,9,0};
int(*px)[2][2] = (int(*)[2][2])arr;

//思考:
// *px 是什么類(lèi)型 
//int[2][2] 二維數(shù)組

//(*px)[1][1]的值是什么? px[0][1][1]的值是什么
//4
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容