C中,陣列名和指標的區別,CC中,陣列名和指標的區別

2021-03-03 20:57:17 字數 4586 閱讀 3899

1樓:匿名使用者

一維陣列 可以認為是常量一維指標. 即除了不能修改值, 其他都可以當指標操作.

多維陣列, 可以認為是對應的陣列指標.

陣列名和指標最大的區別是, 陣列名自身不佔用記憶體空間, 即&陣列名得到的地址還是陣列名值本身, 亦即陣列首地址. 而指標是有自己的記憶體空間的, &指標變數, 得到的是另外一個地址.

c++陣列名和指標的區別

2樓:冰紅茶配黃燜雞

陣列名確實表示指向陣列首地址的指標,但這個指標很特別,它的值(指標的值指的是指標所指的地址)不能被改寫,能改寫的僅僅是其指向的內容,換句話說,陣列名只能指向陣列的首地址,如果有陣列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」

陣列名和指標的區別是什麼?

3樓:手機使用者

可以!下面是我學習陣列

和指標的總結: (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<

4樓:查有福季嫣

可以。a是陣列名,相當於陣列的首地址,b是一個指標,int*b=

a;然後b就指向a這個地址,呼叫b[4]就是b+4的地方,也就是a+4這個地方,然後就是同一個地方,所以b[4]等價於a[4]

5樓:閩忠饒俏

首先指標陣列

和陣列指標叫法本身是種誤導

指標陣列:array

ofpointers,即用於儲存指標的陣列,也就是陣列元素都是指標陣列指標:a

pointerto

anarray,即指向陣列的指標

其次他們本質一個是陣列,一個是指標

int*

a[4]

表示是一個陣列

陣列a中的元素都為int型指標

元素表示:*a[i]

*(a[i])是一樣的,因為優先順序高於*

int(*a)[4]

表示是一個指標

指向陣列a的指標

元素表示:(*a)[i]

#include

using

namespace

std;

intmain()

;int

*a[4];//指標陣列

int(*b)[4];//陣列指標

b=&c;

//將陣列c中元素賦給陣列a

for(int

i=0;i<4;i++)

//輸出看下結果

cout<<*a[1]<

intmain()

{int

a[5];

printf("%d\n",

a);printf("%d\n",

&a);

printf("%d\n",a+

1);//它的進階單位是1個int位元組數

printf("%d\n",

(int*)&a+1);

//它的進階單位是1個int位元組數

int(*)可以強轉為

int*

printf("%d\n",

//它的進階單位是1個int位元組數

printf("%d\n",&a+

1);//它的進階單位是整個陣列的位元組長度printf("%d\n",

&a[0]

+1);

//它的進階單位是1個int位元組數

printf("---------------\n");

printf("%d\n",sizeof(a));

//通過陣列名獲取的是陣列的大小

printf("%d\n",sizeof(&a));

//通過取陣列名獲取的是指標的大小

return0;

c語言中,指標和陣列的區別和聯絡?

6樓:匿名使用者

區別:c語言把記憶體劃分成四個區,它把一般的變數和陣列等存在於記憶體中的棧區,所以陣列在c語言的定義中只是一組同型別的普通變數,即使這個變數有可能是指標。所以他的作用比指標小的很多,而指標可以指向任何區的任何資料,所以就會覺得指標和陣列名很像,但是必須要注意的是,陣列名只是指標中的一種,它是指標中只指向棧區的且指標的移動範圍是有限的,即陣列長度。

而且陣列在定義之初就已經有了自己的記憶體,一般的指標如果未指向某一個記憶體塊時,它是沒有自己的記憶體的,即所謂的野指標。

聯絡:如上面所說,陣列只是定義在棧區的一個連續變數,它的首地址就是一個指標。

總結:不僅陣列有指標,所有變數都有指標,指標說白了就是記憶體中的地址,就像一個房間必須有一個房間號。在c/c++語言中定義一個指標,就是在棧區開闢一個記憶體空間用來存放它指向的記憶體地址,然後給指標賦值,就是把地址值賦值給剛才開闢的記憶體空間,然後通過訪問該記憶體中的地址值來間接訪問該地址下存放的資料。

如果該地址值指向的是一塊靜態儲存區,如字串常量等,當然就不可以修改指向的內容啦。

經驗之談,樓樓加分啊

7樓:匿名使用者

指標就是一個裝地址的變數,陣列是記憶體中的一個區域,而陣列名是這個區域的首地址。也就是說你在定義指標的時候編譯器只分配了一個變數的空間(空間大小由記憶體地址長度決定),而定義陣列的時候編譯器分配了一段區域的空間(空間大小由[ ]裡面的數字和陣列的型別決定)。使用上你可以把一個地址賦值給指標,但是不能賦值給陣列名。

你可以直接給陣列裡面的變數賦值,這是安全的,因為記憶體已經申請好了,而給指標裡面裝個那個地址賦值就要小心了,因為指標裡面那個地址很可能會出錯。

8樓:匿名使用者

陣列 eg: a[10] 這個陣列名a就是一個指標,

那如果是在動態記憶體中建立一個陣列的話,是沒有陣列名可以被使用的,必須用指標(解引用)間接來呼叫,所以陣列和指標是分不開的

9樓:不再猶豫

一維陣列名可以看做一個儲存陣列首地址的常量,不可變。而指標是個儲存地址變數,可根據需要指向不同元素;宣告一個陣列,就可以對陣列相應的儲存空間內的資料進行賦值,修改;指標則是宣告後,必須先對指標賦予地址,然後對所賦予地址中的資料進行賦值,修改(注意越界)

C陣列名和指標的區別,CC中,陣列名和指標的區別

陣列名確實表示指向陣列首地址的指標,但這個指標很特別,它的值 指標的值指的是指標所指的地址 不能被改寫,能改寫的僅僅是其指向的內容,換句話說,陣列名只能指向陣列的首地址,如果有陣列char a 那麼如果出現a a 1 這是編譯都通不過的錯誤。而對於一個普通的指標是可以的,再比如有陣列char a 那...

關於c語言把陣列名賦予指標的問題

就是指向一個地址。陣列第一個元素的地址就是陣列地址。你的理解從本質來 上就有問題自 int p1 a不能通過編譯,因為a是二維陣列指標,型別是int 3 無法轉換到int 型。必須用int p1 3 a或者int p1 a 0 才可以。同理int p2 a 0 無法通過編譯,因為a 0 是一個int...

c語言用二維陣列名引用元素的指標表示方法

a不等抄價於 a 0 0 a和 a 0 0 的值是相同的,bai但型別不同。dua是二維陣列的地zhi 址,而 a 0 0 是int變數的dao地址,含量不同。正確的說法是 a a 0 而a 0 a 0 0 又因為有制 a 0 a 0 a 0 0 我感覺這句理解錯了。bai a 0 a 0 0 而不...