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的地...