C語言指標陣列與二維陣列行指標小問題

2021-03-08 18:04:30 字數 4361 閱讀 3309

1樓:

指標陣列:copy

該陣列中存放的全部都是指標,例如:

原例子中的char *name,這個是一個標準透了的一維陣列,就像是陣列

int a[4];

a[1]=2;

a[2]=3;

不同的是陣列name存放的是指標,陣列a存放的是數字

name[1]=name[2]表示的是把name[2]的指標賦值給name[1]就不難理解了。

二維陣列的行名:

lz假設的陣列char name[5][20]是一個二維陣列,行名name[1]表示的是一個指向字串的指標沒問題吧,這個指標中存放的是一個字串,或者說是一個字元陣列,如果說上例子要改為二維陣列的形式,那麼需要進行strcpy的字串拷貝。

總結:總的來說:指標陣列中的name[1]表示的是一個變數,這個變數中存放的是指標,二維陣列的name[1]表示的是一個指標,指向字串的指標。

如果lz還不明白變數和指標的區別,我也沒辦法解釋了。

2樓:匿名使用者

我覺得是不是這樣啊,二維陣列的話,像a[m][n]那麼a[i]的話是代表第i行的首地址,相當於一專個指標常量,是屬不能被賦值的,是個常量啊,但如果用一維指標陣列的話a[i]就是陣列中第i個指標變數的值了,就可以被賦值了。

只是我個人的看法啊,也沒上網或查書核對,如果 不對大家不要罵啊。

c語言指標陣列和二維陣列的問題

3樓:莊政警

char* str[12]=; //str[0],str[1]這些指標元素所指向的"abcd","1234"這些字串處於記憶體空間的常量區,是常量字串,是不允許修改的,所以strcpy會出錯

而二維陣列裡的字元所組成的字串處於普通的棧空間,是可以修改的.

記住一點:char* s="abcd"; 實際上是 const char* s="abcd";

字元指標指向的字面字串都是常量,不可修改。

4樓:free逍遙星空

涉及到資料是如何儲存分佈的。

一個程式在記憶體中的分佈情況如下圖所示:(圖來自網路,很粗略的圖但是可以用來說明)

char *str[12] = ;

這樣定義出來的資料分佈情況,str這個指標陣列儲存在棧區,作為區域性資料(如果是在函式內部定義)。若是定義為全域性變數則該資料儲存在.data區。

注意這個陣列儲存的是指標,而這些指標實際指向的資料才是真正的字串,而這個字串是源**經過編譯器分析後,放置在只讀資料區.rodata段(因為直接書寫的字串是const型別的,即常量型別的,常量型別不能被修改,下面會解釋原因),在圖上對應的是.text段(這裡是圖中被糅雜在一起了,實際上還是有.

rodata的)。如果程式訪問只讀資料區的話,會經過段選擇子(硬體的一個部件,類似暫存器的東西)的許可權判斷,因為只讀資料區被填寫為只能讀不能寫,因此執行過程中發生錯誤,向作業系統進行報告,最後得到一個異常或者說error。導致你執行錯誤。

而另一種寫的方式:

char str[12][8] = ;編譯器分析出來,這個字串是被定義並放置在棧區,作為區域性資料,全域性變數則在.data區。這個陣列存的就不是指標了,而是字串實體的資料,這個實體資料被放置在棧區或者.

data區,在訪問時段選擇子發現這個區域是可讀可寫的,因此能夠順利進行改寫而不會產生錯誤。以上。

5樓:

勝日尋芳泗水濱,無邊光景一時新.

c語言二維陣列用指標表示的問題

6樓:匿名使用者

#include

void main()

;int (*p)[4];

p=a;

printf("%d",*(p)[3]);

}首先你沒有理解int (*p)[4];

他的意思就是含有4個指標的陣列 由於int a[3][4]只有3行,所以*(p)[3]這個地方就越界了

如果*(p)[2]地址中的值就是17 *(p)[1] 就是9 ,*(p)[0]就是1

如果你要列印7 *((p)[0]+3)

7樓:匿名使用者

因為p[3]沒有指向a[0][3],你加條語言

printf("%x\t%x\n", p[3], &(a[0][3]));

就知道了。

8樓:匿名使用者

printf("%d",(*p)[3]);

9樓:貴藹堂馨蓉

你說要放到另外一個陣列b中,但是沒看到你定義新的陣列,所以我就按我自己的理解做了。

#include

#define

rows

3#define

cols

4double

copy_ptr(double

*tar);//一個變數就夠了

//rows和cols本來就是define的,全域性intmain(void),,

,};double

*p=source[0];

printf("taget[%d][%d]=",rows,cols);

copy_ptr(p);

printf("\n");

while(1)

{}return0;}

double

copy_ptr(double

*tar)

}//直接輸出了……

return0;}

有問題歡迎**……

10樓:匿名使用者

#include

int main()

;int (*p)[4];

p=a;

printf("%d",*(*p+2));

return 0;

}//你沒有理

解多維陣列a的意思

c 語言指標的指標和二維陣列的區別?

11樓:文帝寶寶

指標的指標和二維陣列完全倆東西,二維陣列是 一維陣列的一維陣列,元素是陣列,所以可以隱式轉化為int (*)[3],跟int **兩回事,擴充套件到更多維或其它型別也是成立的,只能隱式轉化為第一維的元素的指標

補充說明下隱式轉化為指標,簡單說就是這樣(t是任意型別)

設有一個陣列t a[10];

a的型別是「t [10]」,在做大多數運算的時候,都先隱式轉化為「t *」型別,即t的指標

對於多維陣列,可以看做是一個一維陣列,陣列的元素型別就是第二維開始的陣列型別,比如:

t a[10][20][30];

是一個有10個型別為「t [20][30]」元素的陣列,用**解釋更清晰:

typedef t u[20][30];

u a[10];

跟上面的定義等價,所以a只能隱式轉化為「u *」,「u *」後也就是「t (*)[20][30]」這個型別了,跟多級指標沒關係,因此,多維陣列不存在到多級指標的轉化規則,強轉只會導致問題

12樓:育知同創教育

二維陣列由若干個一維陣列組成在c語言中定義的二維陣列實際上是一個一維陣列,這個一維陣列的每一個成員又是一個一維陣列。

當變數作為函式的引數時,函式內修改的是形參,實參不變化;(swap(int a, int b))

當指標作為函式的引數時,函式內:若修改指標變數,實參指標指向變數不變。若修改指標指向,實參指標指向的變數變化。(swap(int *a, int *b))

想向大家問一個關於c語言的問題:行指標與二維陣列,行指標詩歌什麼概念呀?

13樓:地獄的冷槍

我們正常情bai況下例如 int a[10];int *p = a;

p指向的就是

dua陣列的首地址。

*p就是裡zhi面的第一個元

dao素。

那麼專再到二維陣列。屬

指標p指向一個二維陣列,那麼p就可以理解為指向二維陣列a的首地址。

你把二維陣列裡面的每一整行看做一個元素,即把二維陣列按照一維陣列去理解,

則*p指向二維陣列的第一行。

則**p就指向第一行的第一個元素。

c語言 指標表示二維陣列問題

14樓:匿名使用者

|你寫的基本沒復什麼問題。制

主函式int **a;

int r,c;

定義其他變數和開啟檔案相同。

fscanf(fp, "%d%d",&r,&c);

if(r<=0 || c<=0) return ;

a=create(r,c);

if(a==null) return;

後續讀取部分相同。

結尾加上記憶體的釋放。

c語言二維陣列與指標運算,C語言二維陣列與指標運算

在 p 4 中p是指向一個有4 個int元素的一維陣列的首地址,int p 4 a就相當於int p 4 p a 兩個語句,所以 p i 指向i行地址,p i c 指向i行c列的地址即a i c int p 4 a 表示指向一維陣列 4列 的指標,然後a 0 地址給了p,p i就表示a i 的地址....

關於二維陣列和指標

p 10的值並不是未定義,正像你說的那樣把2維陣列看成一維陣列,首先將p指向這個一維陣列的首地址,而這個一維陣列的長度是20,也就是說當你p 10的時候指向的是b這個字元上,當你執行的時候會顯示beijing 陣列實際儲存時是按照線形連續儲存的。所謂一維陣列,二維陣列,三維陣列只是為了方便理解和使用...

C 函式呼叫二維陣列,C語言一維陣列轉二維陣列

n如果是變數的話,陣列編譯時都通不過吧。陣列分配時必須知道大小。函式應該這樣宣告function char array 10 10 或省略第一維的大小function char array 10 function char array n n 這樣是錯誤的,陣列的索引必須是個常量表示式。如果需要必須...