如果乙個指標變數存放的又是另乙個指標變數的位址,則稱這個變數為指向指標的指標變數或指向指標的指標。
定義方式: 資料型別 **變數名;
int a=10; //位址為&a
int *p=&a; //指標位址為&p 如果是p就是a的位址
int **p1=&p; //指標位址為&p1 如果是*p1就是&p
要注意這幾個位址的區別,不能混淆了。
指標運算子有兩種:
取內容運算子*
:* 是單目運算子,其結合性為自右至左,用來表示指標變數所指的變數。在 * 運算子之後跟的變數必須是指標變數。
需要注意的是指標運算子(*)和指標變數說明中的指標說明符(*)不是一回事。在指標變數說明中,「*」是型別說明符,表示其後的變數是指標型別,而表示式**現的「*」則是乙個運算子用以表示指標變數所指的變數。例如:
#include
void main(); //二維陣列可以拆分成多個一維陣列,c語言中允許這樣拆分。
printf(" a=%d,",a); //第一行陣列的第乙個資料的位址(a[0][0])
printf(" *a=%d,",*a); //第一行陣列的第乙個資料的位址(a[0][0])
printf(" a[0]=%d,",a[0]); //第一行陣列的第乙個資料的位址(a[0][0])
printf(" &a[0]=%d,",&a[0]); //第一行陣列的第乙個資料的位址(a[0][0])
printf(" &a[0][0]=%d\n",&a[0][0]); //第一行陣列的第乙個資料的位址(a[0][0])
printf("a+1=%d,",a+1); //第二行陣列的第乙個資料的位址(a[1][0])
printf(" *(a+1)=%d,",*(a+1)); //第二行陣列的第乙個資料的位址(a[1][0])
printf(" a[1]=%d,",a[1]); //第二行陣列的第乙個資料的位址(a[1][0])
printf(" &a[1]=%d,",&a[1]); //第二行陣列的第乙個資料的位址(a[1][0])
printf(" &a[1][0]=%d\n",&a[1][0]); //第二行陣列的第乙個資料的位址(a[1][0])
printf("a+2=%d,",a+2); //第三行陣列的第乙個資料的位址(a[2][0])
printf(" *(a+2)=%d,",*(a+2)); //第三行陣列的第乙個資料的位址(a[2][0])
printf(" a[2]=%d,",a[2]); //第三行陣列的第乙個資料的位址(a[2][0])
printf(" &a[2]=%d,",&a[2]); //第三行陣列的第乙個資料的位址(a[2][0])
printf(" &a[2][0]=%d\n\n",&a[2][0]); //第三行陣列的第乙個資料的位址(a[2][0])
printf(" a[1]+1=%-8d,",a[1]+1); //第二行陣列的第二個資料的位址(a[1][1])
printf(" *(a+1)+1=%-8d\n",*(a+1)+1); //第二行陣列的第二個資料的位址(a[1][1])
printf("*(a[1]+1)=%-8d,",*(a[1]+1)); //a[1][1]的資料
printf(" *(*(a+1)+1)=%-8d\n",*(*(a+1)+1)); //a[1][1]的資料
getchar();
執行結果:
a=2686736, *a=2686736, a[0]=2686736, &a[0]=2686736, &a[0][0]=2686736
a+1=2686752, *(a+1)=2686752, a[1]=2686752, &a[1]=2686752, &a[1][0]=2686752
a+2=2686768, *(a+2)=2686768, a[2]=2686768, &a[2]=2686768, &a[2][0]=2686768
a[1]+1=2686756 , *(a+1)+1=2686756
*(a[1]+1)=5 , *(*(a+1)+1)=5
所以推理出:a+i,a[i],*(a+i),&a[i][0]是等同的。此外,&a[i]和a[i]也是等同的。因為在二維陣列中不能把&a[i]理解為元素a[i]的位址,不存在元素a[i]。c語言規定,它是一種位址計算方法,表示陣列a第i行首位址。由此,我們得出:a[i],&a[i],*(a+i)和a+i也都是等同的。另外,a[0]也可以看成是a[0]+0,是一維陣列a[0]的0號元素的首位址,而a[0]+1則是a[0]的第1個元素首位址,由此可得出a[i]+j則是一維陣列a[i]的j號元素首位址,它等於&a[i][j]。由a[i]=*(a+i)得a[i]+j=*(a+i)+j。由於*(a+i)+j是二維陣列a的i行j列元素的首位址,所以,該元素的值等於*(*(a+i)+j)。 指向指標的指標
理解二級指標,關鍵是理解指標的儲存方式和意義。這裡以指向int型指標的指標為例,梳理一下二級指標在記憶體分配中 的奧妙.include using namespace std int main int p a int point p cout a a endl p p endl p p endl p...
指向指標的指標
這幾天我下意識地琢磨到底 錯了,今天猛然明白了他的想法,其實這個技術點我早已掌握,只是當時對問題未深入思考,把握得較模糊,一時沒洞察他的思路,疏忽了。問題大概是這樣的 寫乙個函式,將乙個二維陣列作乙個變換。void rotate array 開闢備份空間 根據變換要求將元素一一賦值 因為這個方法並不...
指向指標的指標
一 回顧指標概念 讓我們先回顧一下指標的概念吧!當我們程式如下申明變數 short int i char a short int pi 程式會在記憶體某位址空間上為各變數開闢空間,如下圖所示。圖中所示中可看出 i 變數在記憶體位址5的位置,佔兩個位元組。a變數在記憶體位址7的位置,佔乙個位元組。接下...