為什麼指向陣列的指標本身和取值後是一樣的

2021-07-08 21:31:16 字數 4718 閱讀 5911

1樓:駒孤簡鵬濤

陣列指標(也稱行指標)

定義int

(*p)[n];

()優先順序高,首先說明p是一個指標,指向一個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p+1時,p要跨過n個整型資料的長度。

如要將二維陣列賦給一指標,應這樣賦值:

inta[3][4];

int(*p)[4];

//該語句是定義一個陣列指標,指向含4個元素的一維陣列。

p=a;

//將該二維陣列的首地址賦給p,也就是a[0]或&a[0][0]

p++;

//該語句執行過後,也就是p=p+1;p跨過行a[0]指向了行a[1]

所以陣列指標也稱指向一維陣列的指標,亦稱行指標。

指標陣列

定義int

*p[n];

優先順序高,先與p結合成為一個陣列,再由int*說明這是一個整型指標陣列,它有n個指標型別的陣列元素。這裡執行p+1時,則p指向下一個陣列元素,這樣賦值是錯誤的:p=a;因為p是個不可知的表示,只存在p[0]、p[1]、p[2]...

p[n-1],而且它們分別是指標變數可以用來存放變數地址。但可以這樣

*p=a;

這裡*p表示指標陣列第一個元素的值,a的首地址的值。

如要將二維陣列賦給一指標陣列:

int*p[3];

inta[3][4];

p++;

//該語句表示p陣列指向下一個陣列元素。注:此陣列每一個元素都是一個指標

for(i=0;i<3;i++)

p[i]=a[i]

這裡int

*p[3]

表示一個一維陣列記憶體放著三個指標變數,分別是p[0]、p[1]、p[2]

所以要分別賦值。

這樣兩者的區別就豁然開朗了,陣列指標只是一個指標變數,似乎是c語言裡專門用來指向二維陣列的,它佔有記憶體中一個指標的儲存空間。指標陣列是多個指標變數,以陣列形式存在記憶體當中,佔有多個指標的儲存空間。

還需要說明的一點就是,同時用來指向二維陣列時,其引用和用陣列名引用都是一樣的。

比如要表示陣列中i行j列一個元素:

*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]

優先順序:()>>*

2樓:暴君坎普

要搞明白陣列指標的含義 這裡*pt指向的是陣列首地址的地址, 這裡*pt==arr, pt==&arr,而對於陣列arr而言,arr就是陣列的首地址,即arr==&arr,所以*pt==pt.

3樓:匿名使用者

是一樣的,你定義的是一個指標陣列,pt就是一個二維陣列的指標,pt是第一行的行地址指向第一行的第一個元素,即元素1,而*pt是一個元素指標,指向的是第一行的第一個元素,也就是元素1

;你輸出他們的時候都是元素1的地址,所以是一樣的啊。

4樓:

*pt是 int *型別的變數,也就是說整形指標。

而pt是 int(*)[3]型別的,printf方法取的是指標的首地址開始到結束位置的內容。

所以無論你用pt 還是*pt都是一樣的。

但是實際上pt和*pt卻不是一樣兒的。

你可以隨便弄個指標,你在printf試試,輸出的肯定是指標所指資料的值,而不是指標本身的地址的值。

pt指向的是陣列的第一位,並且長度是陣列的長度x指標型別的長度,也就是說pt的內容是整個陣列。

*pt指向的是陣列中的第一個整數,其長度是一個整數的長度,也就是*pt的內容就只是第一個元素的值。

你自己可以debug一下就知道了。我剛試過。

5樓:mis_丫

看錯題目了,尷尬

對於陣列指標,pt其實就是arr的首地址,*pt也是arr的首地址,是一樣的

如果不是陣列指標,那是不一樣的。

你輸出的方式不對吧,*pt[0]這樣輸出

本來不想回那麼多,看到那麼多回答真是誤人子弟什麼指標陣列,整形指標都扯出來,

int(*pt)[3]這樣定義是陣列指標的定義!

這樣就說明了一個指向包含有3個元素的整形陣列的陣列指標就是說pt是一個指標,而它指向的物件是一個指標,這題裡面就相當於指標的指標

你說不一樣是因為你輸出方式錯誤

可以這樣輸出*pt[0],*(pt[0]+1),*(pt[0]+2)也可以用指標的指標輸出**pt,*(*pt+1),*(*pt+2)

6樓:跟我走_別後退

因為 arr == &arr

c語言 為什麼指向一維陣列的指標是簡單變數指標而不是陣列指標?

7樓:匿名使用者

指向一維陣列的指標可以是簡單指標也可以是陣列指標。

如,int arr[2]=;

//簡單指標

int *intp=arr;

//陣列指標

int (*arrp)[2]=&arr;

8樓:匿名使用者

首先我bai提一個觀點,數du組是陣列,指標是指標。兩者是zhi

不同的dao東西,希望你不要搞混。

簡單的版指標變數通常是指向權一個單一元素,指標變數中存放的是元素的地址,通過鑰匙*取出地址中的值。因為陣列是用一段連續的地址空間來儲存的,所以知道某一個元素加地址偏移量就能知道所有陣列的值。陣列指標是一個指標,指標指向一個陣列,偏移是按陣列來偏移的。

9樓:

指向一維陣列的

指標也「不是簡單變數指標而是陣列指標」。你把一維陣列首指標與

專指向一屬維陣列的指標混淆了。操作一維陣列就是操作一維陣列的元素,而元素是挨個存放的,所以只需要其中一個元素(通常是下標為0的元素)的指標就可以通過加減一個常數或用下標操作所有元素了,所以操作一維陣列的指標是指向元素的指標,不需要指向陣列的指標。操作多維陣列,比如二維陣列,操作每個元素時使用的也是這一行的第一個元素的指標,與操作一維陣列是一樣的;而操作二維陣列的整行時才用得著「指向陣列」的指標。

所以二維陣列的指標是二級指標,第一級是「陣列指標」,管陣列的行,第二級就是元素指標,管每行的元素。所以我們通常所說的一維陣列的指標是不嚴謹的,其實是第一個元素的指標,叫陣列「首指標」。

c語言中關於指向陣列的指標

10樓:

char str[100];

char *pi=str; //相當於char *pi ;pi=str;

char **ppi=*pi;//這個地方抄錯了。應為char **ppi=&pi;

定義加*表明這是指標型別的變數

用的時候,就是用的指標,加*幹什麼。

只有取指標所指變數的值,或給指標所指的變數賦值的等涉及指標所指的變數的時候,

才會又加*號,表示獲取或改變,指標所指變數的值。

char x=10;

*pi =x; //給指標所指的變數賦值,改變指標所指變數的值(改變*pi) 。

x=*pi; //取指標所指的值,取指標pi所指的變數的值(表示為*pi)賦值給x。

11樓:匿名使用者

pi ppi是指標 帶*是取值的意思

*pi=str 意思是把str這個陣列的首地址 放在pi所指的空間裡 換句話說就是pi指向了str陣列。用pi+1之類的就可以指向陣列裡面的東西 *(pi+1)等同於str[1]

12樓:匿名使用者

因為不管是str還是pi, ppi都指的是地址,函式呼叫時只需要知道引數的地址就行,然後再去取裡邊的值,而不用加上星號來傳遞裡邊的值。

13樓:匿名使用者

因為陣列的名字,本身就是指向陣列頭的指標。另外char **ppi=*pi;是不對的吧。這意思是給一個指標賦值一個常數,這樣的賦值只允許右值為0的

14樓:

你給的第三條語句語法是錯的,應該是char **ppi=π

15樓:連嘉悅牢義

首先要明白,指標陣列中儲存的是指標,也就是說兩個元素都是指標,而且存放的也的確是「a」和「a」的地址,但要知道字串和字元是兩個不同的資料型別,也就是說雖然存放的地址是一樣的,但指標的型別不能理解為是指向字元「a」和「a」的指標,應該是指向字串「abcd」和「abcd」的,明白的麼?

16樓:端麗芳表曄

要點:理解陣列名其實就是一把指標!它指向所有元素的第一個inta[10];

則它的記憶體分佈:a[0]

a[1]

a[2]

a[3]

a[4]

a[5]

a[6]

a[7]

a[8]

a[9]

陣列名a

就是指向了第一個元素

a[0]

的地址(注意是地址)所以上面的也可表示為:

*(a+0)

*(a+1)

*(a+2)

*(a+3)

*(a+4)

*(a+5)

*(a+6)

*(a+7)

*(a+8)

*(a+9)這是一樣的!而如果定義一把指標並賦值:

int*p;p=

a;則p

現在和a都指向了第一個元素a[0]的地址,所以它的用法和a一樣如:*(p+0)=p[0]=a[0]=*(a+0)

,*(p+1)=p[1]=a[1]=*(a+1)……看領會下就懂了哦~~~

陣列名和指標的區別C語言中陣列名和指標的區別

可以!下面是我學習陣列和指標的總結 1 指向陣列首地址 對於一維陣列a 10 陣列的首地址為a 呼叫 p a a i 或者 p i 對於二維陣列a 3 4 整個陣列的首地址為a 0 呼叫 p a 0 a 0 i 或者 p i 此時a代表陣列第一行的地址。3 指向陣列的每行 形如 int a 3 4 ...

c語言中指標陣列和行指標的區別是什麼

int p 4 這個就是行指標 這種型別的指標p是指向一個一維陣列,這個一維陣列包含4個整形元素 但是 int a 4 p a 這種方式卻是不對的 因為p只能指向一個整型的一維陣列,不能指向一個整型資料,a所指向的正是a 0 是個整型數 實際上int p 4 這種型別的指標是用於多維陣列中的,比如定...

邏輯變數和邏輯函式的取值為什麼只有0和1兩種可能

因為邏輯判斷 只包含真 和 假 1代表真 0代表假 邏輯運算不同於一般的數 算 他指專門針對邏輯的真假 作出判斷 而不是像數 算那樣的 加減乘除等等 邏輯變數和邏輯函式的取值為什麼只有0和1兩種可能 因為邏輯判斷只包含真和假 1代表真 0代表假 邏輯運算和一般的數 算不同,他只專門針對邏輯的真假作出...