C 的指標和陣列問題,C 的指標和陣列問題

2022-05-18 15:46:38 字數 1576 閱讀 5397

1樓:

這種二維指標是不能操作這種二維陣列的,二維指標就是指標的指標,而這種情況應該用陣列指標,另外,由於二維自動陣列也是順序存放的,所以可以用一維指標傳遞二維陣列的地址。

2樓:晨曦文俊

首先,你對指標沒有弄明白,最後詳細系統的瞭解一下指標的知識,這你可以參考c++語言程式設計教材的指標部分。第二,來說說本題,如果你把int *p; p=a;則可以實現如上的操作。這是為什麼呢?

因為,陣列名即是一個指標(通常老師會這樣告訴我們),而**p,它是一個指標的指標,即我們所說的二級指標,它存的是一個指標的地址。假如陣列a首地址為ffd0;則q所指向的儲存單元裡存的是ffd0;但是二級指標*p向的是q;即p的記憶體單元了存的是q的地址ffc0(如果我們做如下操作,p=&q)具體請參照**。

3樓:

//可以這樣啊!

int b[2][2]=; int (*p)[2];//p為行指標,每行2個元素,其型別與二維陣列名b等價。

p=b;

4樓:匿名使用者

1.二維陣列可以通過*(*(a+i)+j)或者*(a[i]+j)來訪問

這樣通過*p++也可以訪問二維陣列。

這所定義的 int **p 是指向指標的指標

5樓:匿名使用者

陣列是一種型別,獨立的型別,不是什麼指標或者地址。

所謂陣列名能作為陣列首地址,是因為c++進行了隱式的型別轉換。就好像

char c = 'a';

int i = c;

一樣,其實是int i = static_cast(c);,只不過char型別被隱式轉換成int不需要寫出來。所以陣列作為地址時c++其實做的是int *p=static_cast(a);,這是一種內建的隱式型別轉換而已,把陣列轉換成元素指標,值為陣列首地址。

在使用模板,以及過載和引數推斷的時候,某些情況下很容易發現陣列和指標不是一個型別,因為這種隱式的型別轉換並不是所有時候都會自動應用。

至於說到陣列是常指標,現在就很容易明白真實原因了。因為陣列型別沒有定義賦值操作這種運算,而且和指標也不是同一種型別,當然不能賦值了:)就算有型別轉換也不行,比如

float f; ((int)float) = 0;

這樣的賦值顯然不正確,類似

a+b = c;

也是不正確的賦值。因為型別轉換和表示式求值的而結果都是右值,簡單的說是編譯器產生了一個無法引用的臨時變數存放結果,當然不能給他賦值了,所以

int *p = 0;

static_cast(a) = p; //static_cast(a)在這裡相當於(int*)a

也是不正確的,這樣陣列看起來好像就是常數指標了。

國內的教材和老師為了讓學生一下子記住陣列的使用,不求理解,而且容易講,一般都會說陣列名是個常量指標。如果看一些外國的教程的話,如c++prime之類,都會強調陣列是一種型別,不同於指標。

這樣為什麼sizeof能表示整個陣列的長度就沒問題了吧,因為陣列本來就是一種具有自己獨立屬性的型別嘛。

你的串號我已經記下,採納後我會幫你製作

c語言陣列與指標問題,c語言陣列與指標的問題關係請教

1,書上說的不準確,陣列應該看做一種獨立的型別,sizeof只與型別有關。詳細的可以參考這個 http 如果你弄明白了這個剩下就簡單了。2,我先說一下結論吧。按照你的要求應該這樣定義p int p 3 因為你想要的是訪問每一行的數字,所以需要p為整型指標的陣列,這樣每個元素是整型指標,可以像p 1 ...

請教指標與陣列的問題,C語言的問題,指標陣列

是可以的。c在這裡是很靈活的。int a 10 相當於int const a int malloc sizeof int 10 陣列名a相當於一個常量指標,指向int型別。同樣也可以把指標當成變數型的陣列名,如你文中所說。無論是常量型的a i 還是變數型的pbuf i 編譯之後其實都是執行的 a i...

c語言的指標問題,C語言的指標問題

printf c p 3 分佈來看,c是要列印輸出一個字元。p指向那個字元陣列,p就是字元 a 那麼 a 3是多少呢,a 1是b 2 是c 3 是d注意是 p 3 而不是 p 3 這是由區別的。是的。p 3。是對p指向的那個值加3,p開始是指向a的,故a加3後就是d了 而p 執行3次的話,是指標p本...