Clang Array And Pointer
本文關(guān)鍵詞:C語(yǔ)言點(diǎn)滴,由筆耕文化傳播整理發(fā)布。
layout: post title: “C語(yǔ)言的指針與數(shù)組種種關(guān)系” category: “c/c++” tags: [sizeof] —
此篇為《C語(yǔ)言點(diǎn)滴》關(guān)于指針的總結(jié)
一. 指針與數(shù)組關(guān)系指針 數(shù)組
指針 指針指針 指針數(shù)組
數(shù)組 數(shù)組指針 數(shù)組數(shù)組
表1 指針與數(shù)組的組合
假設(shè)以int類型測(cè)試:
指針 數(shù)組
指針 指針指針: int **pp 指針數(shù)組: int *pa[5]
數(shù)組 數(shù)組指針: int (*ap)[5] 數(shù)組數(shù)組: int aa[2][3]
表2:四個(gè)概念的定義
真理:指針變量 數(shù)組變量
char 類型 char *p char a[5]
指針類型 int **pp int *pa[5]
數(shù)組類型 int (*ap)[5] int aa[2][3]
表3 指針變量可指向?qū)?yīng)數(shù)組變量
二. 指針指針、指針數(shù)組、數(shù)組指針 2.1 指針型指針關(guān)于指針型指針,如:
int i = 5; printf("i=%d, &i=%p\n", i, &i); int *p = &i; printf("*p=%d, p=%p, &p=%p\n", *p, p, &p); int **pp = &p; printf("*pp=%d, pp=%p, &pp=%p\n", **pp, pp, &pp);打印輸出:
i=5, &i=0x004f5a6c *p=5, p=0x004f5a6c, &p=0x004f5a5a *pp=5, pp=0x004f5a5a, &pp=0x004f5a4c 每個(gè)變量,無(wú)論它保存的是什么,它本身也都有地址:如下圖示:
圖1:示意圖
2.2 指針數(shù)組對(duì)于一個(gè)指針數(shù)組,數(shù)組中保存的都是指針,數(shù)組名就是指針型地址。為了保存這種指針型地址,根據(jù)指針真理,我們自然應(yīng)該用指針型指針了。
如 int *p[3] ,這是因?yàn)?[] 的優(yōu)先級(jí)比 * 號(hào)高,所以 int *p[3] 會(huì)被編譯器解釋為 int *(p[3]) 。這就是指針數(shù)組
見下:
char *a[] = {"人生苦短", ":grin:", "Python當(dāng)歌", NULL}; // 指針數(shù)組 char **p; // 指針指針 for (p = a; *p != NULL; p++) { printf("%s\n", *p); }打印輸出:
人生苦短 :grin: Python當(dāng)歌 2.3 數(shù)組指針如何定義一個(gè)數(shù)組型的指針?不能寫成 int *p[3] ,這是因?yàn)?[] 的優(yōu)先級(jí)比 * 號(hào)高,所以 int *p[3] 會(huì)被編譯器解釋為 int *(p[3]) 。這其實(shí)就是上面介紹過(guò)的指針數(shù)組,而不是我們要定義的數(shù)組指針。為了解決這個(gè)問(wèn)題,我們用括號(hào)改變它的優(yōu)先級(jí),寫成 int (*p)[3] 。這時(shí) (*p) 是一個(gè)指針,指針指向的類型為 int[3] ,這是一個(gè)一維數(shù)組型變量,符合我們的定義。
圖2:對(duì)比一維和二維的數(shù)組指針實(shí)例
有了 int (*p)[3]=array[2][3] 的寫法,我們對(duì)二維數(shù)組也可以利用指針來(lái)進(jìn)行訪問(wèn)了,如下面所示:
還是看代碼測(cè)試吧:
int array[2][3] = { {101, 102, 103}, {201, 202, 203} }; int (*p)[3] = array; printf("p=%p, &array[0]=%p\n", p, &array[0]); printf(p == &array[0] ? "true\n" : "false\n"); /* * out: * p=0x7fff5cfa2540, &array[0]=0x7fff5cfa2540 * true */ printf("p+1=%p, &array[1]=%p\n", p+1, &array[1]); printf(p+1 == &array[1] ? "true\n" : "false\n"); /* * out: * p+1=0x7fff5cfa254c, &array[1]=0x7fff5cfa254c * true */ printf("*(p+1)=%p, array[1]=%p\n", *(p+1), array[1]); printf(*(p+1) == array[1] ? "true\n" : "false\n"); /* * out: * *(p+1)=0x7fff5cfa254c, array[1]=0x7fff5cfa254c * true */ printf("*(p+1)+2=%p, &(array[1][2])=%p\n", *(p+1)+2, &(array[1][2])); printf(*(p+1)+2 == &(array[1][2]) ? "true\n" : "false\n"); /* * out: * *(p+1)+2=0x7fff5cfa2554, &(array[1][2])=0x7fff5cfa2554 * true */ printf("*(*(p+1)+2)=%d, array[1][2]=%d\n", *(*(p+1)+2), array[1][2]); printf(*(*(p+1)+2) == array[1][2] ? "true\n" : "false\n"); /* * out: * *(*(p+1)+2)=203, array[1][2]=203 * true */關(guān)鍵部分就是 優(yōu)先級(jí) , 如 () > [] > *
下面兩篇文章基本搞定:
如果還不清楚,就看《深入理解C指針》這本不到200頁(yè)的書。
本文關(guān)鍵詞:C語(yǔ)言點(diǎn)滴,由筆耕文化傳播整理發(fā)布。
本文編號(hào):249784
本文鏈接:http://sikaile.net/wenshubaike/mishujinen/249784.html