1樓:匿名使用者
其實可以認為陣列名就是乙個不可更改的常量指標。但是
,嚴格來說,二者有一定區別,比如sizeof(a),a為陣列名的時候,算出來是a這個陣列所佔位元組數,但是如果a是指標,不管指向什麼,結果都是乙個int的位元組數(取決於特定機器)。因而,有人認為陣列名是乙個可以退化為常量指標的型別,這種退化在陣列名作為函式形參的時候表現得最為明顯,可以參考陣列名作為形參退化為指標的問題。
c語言中陣列名和指標的區別
2樓:匿名使用者
陣列在當作引數傳遞時,可以當作指標;當然,引數傳遞相當於賦值操作,所以用指標來接受陣列的值也是可以的。
除此之外,指標就是指標,陣列就是陣列,一點也不一樣,例如1,陣列名不能作為左值,即不能被賦值,也不能進行++ --操作2,sizeof 陣列名 和 sizeof 指標 不同
3樓:
陣列名本質上就是個指標,也就是位址,但是它是乙個常指標,是個固定值,而指標是是指標變數的簡稱,是個變數,這個變數存放的是位址值,它的值是可以改變的。例如:
int *p;
int a,b;
p=&a; //把變數a的位址賦值給指標p,那麼指標p就指向了變數a的記憶體單元
p=&b; //把變數b的位址賦值給指標p,那麼指標p就指向了變數b的記憶體單元
int a[10]; //整型陣列,陣列名a本質上是乙個位址,是首元素位址,它是乙個固定值,不能對它進行賦值操作。
c語言陣列名和指標的區別?
4樓:匿名使用者
陣列名確實表示指向陣列首位址的指標,但這個指標很特別,它的值(指標的值指的是指標所指的位址)不能被改寫,能改寫的僅僅是其指向的內容,換句話說,陣列名只能指向陣列的首位址,如果有陣列char a;那麼如果出現a = a+1;這是編譯都通不過的錯誤。而對於乙個普通的指標是可以的,再比如有陣列char a;那麼再定義乙個char *p = a;然後再用p = p+1是合法的,這表示讓指標p指向&a[1]。
它們的第二個區別是:每當用到陣列名這個指標的時候,系統都會傳入陣列的資訊,而普通的指標只是乙個4位元組的整數,例如:
char a[5];
char *p = a;//指標a和指標p都指向陣列a的首位址cout << sizeof (a) << "##" << sizeof (p) << endl;
這時的執行結果是「5##4」
5樓:塞上孤獨
為什麼陣列名的那個指標不能運算,也就是你說的不能改寫,告訴你那是因為陣列一旦定義了,就放到常量區了,你試試看你能改變常量嗎?
陣列名和指標的區別?
6樓:百度使用者
可以!下面是我學習陣列和指標的總結: (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];
int (*p)[4]; p=a;
呼叫:*(*(p+i)+j)例:;
int (*p)[4],i,j;
cin>>i>>j;
p=a; //a代表的是陣列第一行的首位址.
cout<<*(*(p+i)+j)< (4)指標陣列 例如:(字串陣列指標法) ; cout< 處理字串還有以下方法: (字元陣列法,c-string法) ;cout< (字串陣列法,string法) ; cout< 三種方法的共同點是name[0]都是代表的"basic"的首位址而非其本身。 (5)指向指標的指標 形如 char **p;例:; p=name+2; cout<<*p< cout<<**p< 分析:*p=name[2]= "c++"的首位址,(通常所說乙個字串的「位址」實際上指的是它的「首位址」或者「起始位址」),用cout 輸出的不是字串的首位址而是整個字串(只要把乙個字串的起始位址給它,cout就一直往後面輸出,直到遇到結束符'\0'為止),為了證明這一點,請看:string a=「finish」;cout<
故:本例中第乙個*p輸出"c++",第二個**p代表"c++"的首位址的內容,即c。 在上一例中,name[0]為"basic"的首位址,輸出"basic",若換成*name[0]則輸出b,若換成name則代表整個陣列的首位址(而不是單個字串"basic"的首位址),所以此時輸出的是整個陣列的首位址。若用*name則輸出整個陣列的首位址的內容,即"basic"(可見字串的首位址內容為單個字元,一維陣列首位址的內容為它的第乙個元素,對於二維陣列,比如int a[3][4],a代表的是第一行的位址,所以cout<
c語言中:陣列指標與指標陣列有什麼區別? 7樓:匿名使用者 陣列指標是指向這個陣列首位址的指標,指向物件是這個陣列; 指標陣列是存放一類指標的陣列,這個陣列的每個元素都是乙個指標; 例子:int a[10]; int* s; s = a;//這裡s就是乙個陣列指標,它的值就是陣列a 的首位址;當然,如果a是乙個整數,那s就是乙個指向整型的指標; int a; int* s[5]; for(int i=0;i<5;i++)s[i]=a; //這裡s就是乙個指標陣列,它的每個元素都是整型變數a的位址應該算比較明白了吧 謝樓上提醒 8樓:天雲一號 int (*p)[4]; // 定義乙個陣列指標,指向含4個元素的一維陣列,陣列元素是int型別。 int *p[4]; // 定義乙個指標陣列,陣列中每個元素是乙個指標,指標指向**就要根據程式來定了。 判斷陣列指標與指標陣列主要通過運算子的優先順序來判斷。 int (*p)[4]; // 由於( )的優先順序高,說明p是乙個指標,指向乙個一維陣列的指標 int *p[4]; // 由於[ ]的優先順序高,先與p結合成為乙個陣列,再由int*說明這是乙個整型指標陣列 9樓:匿名使用者 1.大概說一下這三種 int * a; 這叫整型指標 這玩意兒不能指向陣列,搞清楚指向的是陣列首元素 int (* b); 這叫整型陣列指標 意思是指向陣列的指標 int * c[5]=null; 這叫整型指標陣列 意思是儲存指標的陣列 下來舉個例子,理解一下: 2.定義乙個陣列,下面舉例解釋 int i[5]=; //定義整型陣列,五元素皆為0 int n[5][5]=; //定義二維陣列 3.三種分別舉例 (a的例子) a=i; //這裡i是陣列名,i相當於&i[0]。陣列名相當於是陣列i的首位址。此時* a指向陣列i首元素。 a++;然後輸出就是i[1]的值 (b的例子) b=n; //二維陣列名相當於n[5]這個陣列,注意這塊兒,這塊兒最難搞清楚。n代表的不是第一行第乙個元素的位址,而是代表第一行元素的所有位址的陣列。這塊的指標陣列b相當於存放了n陣列第一行的所有元素的位址。 //這塊的陣列指標b和上面的指標a比較,a指向的是陣列的首元素,而b指向的是整個陣列(或者說是存放了整個一維陣列的多個元素(二維陣列由一維陣列構成,二維陣列的第一行即是乙個一位陣列)) 然後我們輸出(* b)[2]相當於輸出了n[0][2] 如果b++然後輸出(* b)[2]相當於輸出了n[1][2] c的玩法: 太簡單了,不想說了。就是存放多個指標的陣列,自己想想。 10樓:匿名使用者 摟主先要明確每個詞的後面乙個名詞代表其所要定義的型別陣列指標就是指向乙個陣列首位址的指標(aa); 舉例:char a="hello world"; char *aa; aa=a; 指標陣列就是乙個陣列,這個陣列的元素是指標; 舉例:char a='t'; char *aa[2]; a[0]=a; a[1]=a; 附:感覺樓上的這段舉例有點問題 int a[10]; int* s; s = &a; c/c++中,陣列名和指標的區別 11樓:匿名使用者 一維陣列 可以認為是常量一維指標. 即除了不能修改值, 其他都可以當指標操作. 多維陣列, 可以認為是對應的陣列指標. 陣列名和指標最大的區別是, 陣列名自身不佔用記憶體空間, 即&陣列名得到的位址還是陣列名值本身, 亦即陣列首位址. 而指標是有自己的記憶體空間的, &指標變數, 得到的是另外乙個位址. 分析c語言中陣列名和指標的區別 12樓:匿名使用者 陣列名指向陣列的首位址,相當於位址常量,只能做右值。 指標就是指向固定大小記憶體的位址,又分指標變數和指標常量。 所以陣列名也屬於指標。 先說些這個2維陣列 int arr 3 4 可以理解為乙個3行四列的矩陣,那麼第一維arr 0 arr 1 arr 2 中存的分別是對應行的位址,也就是說arr 0 存的是乙個 大小為4的整形陣列位址 這樣的話就好理解了,arr存的位址值其實與arr 0 本質上是相同的。都是這個連續空間的開始位址。... a 1表示字串中第1個字元 從0計數 開始,它代表乙個位址沒錯,但是c 中字串對 的過載功能,表示從當前位址直到字串結束到輸出到標準輸出,即列印埠,所以當char a asdf 時,cout a 1就會列印sdf char陣列比較特殊,你用int陣列來看看 字串會連續輸出,直到遇見 0 int陣列就... 視窗關閉就意味著程式的結束,所以陣列名指標就會到了最開始的位置。常量在一次執行時不變,誰告訴你,兩次執行也不變,何況 p你不用,非用 x誰告訴你這是正確用法,這是未定義的!在windows裡用vc的話,由於每個程序都有自己的位址空間,都從0x00400000開始執行,載入後資料的位址應該一樣的,雖然...關於c語言二維陣列陣列名與指標的問題
c中陣列名到底是不是位址,c中陣列名到底是不是乙個位址?
C語言書上說,陣列名是指標常量,可是我每次執行程式後位址都會改變啊