陣列指標問題,陣列指標,指標陣列區別 要詳細,超詳細 我區分了好多次了,還是不清楚啊

時間 2022-05-19 07:25:01

1樓:小飛花兒的憂傷

arr是一維陣列,只是個名字而已,不是指標。

q = arr;則q = 陣列首地址,

p = &q;則p指向q。

陣列名在值傳遞時傳遞的是首元素地址,所以很多人把他當做指標,老師往往也不加以區分,但看看這兩個

int arr[100],*p=arr;

arr == &arr; //這是成立的,左邊是陣列首元素地址,右邊對整個陣列取地址得到陣列首地址,二者相等

p == &p;//這不成立,p的內容也地址沒什麼聯絡。

sizeof(arr) == sizeof(p)//不成立,因為arr是陣列名字,計算大小是整個陣列大小,sizeof(p)求得的只是一個整型大小

可以看出陣列名和指標是不一樣的兩個東東

2樓:後知後覺

你好,q被定義為一個指向整型資料的指標,而arr[100]是一個二維陣列,arr是一個二維陣列名,它是一個指向一維陣列的指標,而不是指向一個整型資料的指標,所以q和arr是兩種不同的指標,你寫q=arr就是錯誤的。可以改成q=arr[0],因為arr[0]是指向整型資料的指標。建議你先將指標那一章關於陣列和指標的內容理解透。

3樓:匿名使用者

1. char p= "hello world";%a getmemory()呼叫時,在stack段給"hello world"分配memory。getmemory()退出時釋放getmemory()的stack段。

str指向的地址不存在,為無效指標。%a2. char *p = "hello world";時,"hello world"存放在rodata段,不能被改變,也不會被釋放。

4樓:鈺氏幽默

應該叫做指標指向陣列的首地址…

5樓:

陣列名即是常量首地址

陣列指標,指標陣列區別!要詳細,超詳細!我區分了好多次了,還是不清楚啊

6樓:匿名使用者

int a[3][4]這個無需多說,就是一個二維陣列。

int (*p)[4]就相當於int p[4],它就是一個二維陣列的指標,可以指向一個第二維度為4的二維陣列。而a就是這樣的陣列,因而下面是合法的。

p=a;

int *p[3]是指標陣列。說白了,就是定義了三個指標,分別為p[0],p[1],p[2]。可以將他們單獨拿來使用。

int a1,a2,a3;

p[0]=&a1;

p[1]=&a2;

p[2]=&a3;

7樓:草迎風

1、在c和c++中陣列的指標就是陣列的起始地址(也就第一個元素的地址),而且標準文件規定陣列名代表陣列的地址(這是地址數值層面的陣列表示)。

2、指標陣列是指一個陣列中的每個元素都是一個指標,也就是多維陣列。

說白了,陣列指標就是指指向陣列首地址的指標,也可以說是陣列的首地址。而指標陣列,按字面意思,指標的陣列,存放指標的陣列,也就是陣列中每一個元素都是指標,即多維陣列。

總而言之,陣列指標是指一個指標,而指標陣列是一個多維陣列。

例子:int a[3][4];int (*p)[4];int *p[3]

第一個,是指標陣列,a[3][4]可以看成是存放三個指標的陣列a[3],且每個指標指向一個存放4個整型資料的陣列。

第二個,int (*p)[4];這個和第一個例子的表達的意思一模一樣,我們可以這樣賦值:

int (*p)[4]=a;其中p表示指向存放4個整型資料陣列的指標,不過它沒有給出指標的具體定義,所以我們還可以用這樣賦值來理解:

若int b[n][4];(n為int資料)則int (*p)[4]=b;(p也是指向一個存放4個整型數的陣列,但這裡有n個p指標!)。

第三個,int *p[3];它定義了一組存放三個指標的整型陣列,我們可以近似地理解:

如int *q;(定義了一個q指標);

int *p[3];(定義了一組指標)。(這一組指標的定義等同於這樣三個指標的定義:int *x,*y,*z。)

8樓:匿名使用者

其實很簡單,不論是什麼指標,只要是型別匹配地址它就可以存放,因為指標就是地址!

int a[3][4] 這是一個普通的二維陣列

int (*p)[4] 這是一個指向有4個int型的一維陣列的指標,可以稱它為行指標(一行有4個int)

int *p[3]這是個有三個元素為指標的陣列

後面兩者都有指標,所以只要是地址,後面兩者都可接收,關鍵是在運算的時候你要弄清楚它具體是個什麼樣的指標,因為它們移動的位是不同的。普通指標一次移動一個元素,行指標一次移動一行。。。int a[3][4];int (*p)[4]=a;這樣把a的首地址給了行指標,p+i就是將p移到了a 的第 i行。

可以把*和&看成逆運算,行指標取*就成了列指標,也就是普通指標。*(p+i)就是一個位於a第i行首元素位置的普通指標,再移動j個位置取*就得到了a[i][j]的值即*(*(p+i)+j),用for迴圈可以輸出陣列。

如果用for(i=0;i<3;i++) p[i]=a[i];這樣三個普通指標分別指向了a的三行,可以用

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

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

printf("%d",*(*(p+i)+j));輸出a的所有元素。其中*(p+i)為p[i].

9樓:匿名使用者

int a[3][4]; 這個不用多說一個二維陣列。

int (*p)[4];這個是指向陣列的指標,就是說定義了一個 p 指標變數,它是指向int型陣列的。

可以讓p指向a, p=a;他就是一個指標變數。用法你還是自己試試才能明白。

int *p[3];這個肯定就是一個陣列了,就像int p[3],只不過他是int 指標型別了,

也就是說p[0],p[1],p[2] 只能放一個地址。

你在慢慢體會一下,明白就自己在程式設計試試就知道了。

10樓:白花戀歌

指標陣列,array of pointers

陣列指標 a pointer to array

看看英文名字就知道了,中文翻譯真的害死人。。。。

11樓:匿名使用者

陣列指標--指向陣列的指標,是一個指標,其指向的型別是陣列;指標陣列--元素為指標的陣列,是一個陣列,其中的元素為指標。

12樓:

這個不好描述,不過用od一看你就明白了,如 int a[3][4]; 就a在程式偏移地址0x000ef456:0x00,0x00,0x00,0x00,.

0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,

關於陣列指標的問題

13樓:風若遠去何人留

這個本來就沒必要用雙迴圈的.

改成while(*pch)

ch2[i] = 0;

puts(ch2);

c語言的問題,指標陣列

14樓:匿名使用者

改變不了,字串常量是改不了的,你可以試試char *p = "aaaaa";

p[1] = b;這樣是改不了的

只能定義二維陣列才可以改

char p[3][100] = ; 這樣才可以改,不要問為什麼,字串常量就是不能改

15樓:千鋒教育

直接讓指標指向另一個字串即可

p[0]="aaaa";

16樓:橙

這樣定義指標指向的字串是無法修改的。

關於陣列首地址賦值給指標和陣列指標的問題

17樓:匿名使用者

權威答案:

1. a是陣列的首地址,&a是不符合語法的,因為a是常數地址,它是沒有地址的地址,

有的c++版本,可能把 &a直接處理成a了,所以,是一樣的了;

2。 int (*pa)[5] , 定義的二維陣列指標,相當於 int pa[ ][5];

而a是一維陣列,所以,型別不一會報告出錯;

18樓:雙存釁璟

陣列之間直接賦值是不容許的!可以使用字串複製函式strcpylz的程式可以改為

#include

char

name[10];

void

aa(char

*p)其實strcpy很不安全,尤其在lz的程式中。

「指標這方面的書籍」——建議看《c和指標》

19樓:匿名使用者

a代表的是陣列首元素的首地址,即&a[0]的地址;

&a代表的是陣列的首地址;

a+1代表的是a[1]的首地址;

&a+1是下一個陣列的首地址;

再看int (*pa)[5]這個定義的意思是定義一個陣列指標,(陣列為匿名的包含5個元素的陣列),指向的是整個陣列,而非單個陣列元素

不同的編譯器未必是一樣的處理,有些可能是警告,執行時也沒問題(因為a和&a地址是相同的)

但有些編譯器可能就直接報錯,因為這麼用確實是錯的

20樓:匿名使用者

從編譯器的角度來講,int *p定義了一個指向int型的指標p。而a本身已經是指向int型的指標了,對a做取值操作,返回的結果是int **型別的,造成型別不匹配,所以不能這樣寫:int *p = &a;

而int (*pa)[5]定義了一個指向5個元素的int陣列的指標,而a只是陣列的首地址,&a才是陣列的指標,同樣也是因為型別不匹配。

21樓:灰人王

a本身就是指標了,你取它的地址,就是取指標的地址,那當然不對了。

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

22樓:

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。

23樓:匿名使用者

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

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

24樓:匿名使用者

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

25樓:匿名使用者

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

26樓:

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

c語言問題,陣列與指標,C語言陣列和指標的問題

char a computer a指向一個常量字串,常量字串是不能修改的,而你的for迴圈內要修改a指向的這個常量字串,自然要出錯 char a computer 這個a就是個普通陣列了,它的內容是可以改動的,就不會出錯了 因為 a是個指標啊 所以應該賦值賦地址!所以 應該 char a compu...

C語言陣列(指標)越界訪問,C語言指標越界問題,大神指教!!!

與編譯器無關,只與記憶體管理機制有關,是作業系統級別的問題,堆疊的讀取方式只是資料結構上的不同,在機器層面,依然是單純的記憶體讀寫操作 陣列越界訪問的危險性不好評估,但確實是最嚴重的危險之一 結果基本上會100 崩潰,但是崩潰的原因很可能不一樣,就算是同一段越界 跑幾遍,原因也可能是不一樣的 指標越...

C語言指標和陣列的問題,急

斌and麗 你的程式本來就寫的有錯誤吧!你真的可以執行嗎?用的什麼工具啊?int main void int p1,p2,p3 p2 a 這種賦值是錯誤的吧 p1 a p3 a 4 getch 這裡應該改為getchar return 0 a a a 0 都是一個值,指向首地址。p1是取指標p1的地...