從編譯器角度分析C語言中陣列名和指標的區別

2021-03-19 18:19:19 字數 3376 閱讀 2900

1樓:匿名使用者

從編譯生成的角度來說

陣列名 沒有本身的儲存空間,其只是一個地址。 代表陣列的首地址。

於是 陣列名的值 不可能被改變。

而指標 是一個變數 有自身的儲存空間

可以被改變值 執行數學操作。

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樓:塞上孤獨

為什麼陣列名的那個指標不能運算,也就是你說的不能改寫,告訴你那是因為陣列一旦定義了,就放到常量區了,你試試看你能改變常量嗎?

c語言中陣列名和指標變數的區別

6樓:銷

陣列名除了sizeof會返回陣列大小,其他的實況下是相當於一個指標常量無區別的(指標常量也就是說,不能改變陣列名的值,比如int a[10]; a++,a--,a=a+10等都是非法的)

c語言中陣列名和指標的區別 及 sizeof用法

7樓:匿名使用者

指標需要給一個明確的指向才能使用,否則就是一個野指標。

陣列名就是一個有明確指向的指標。

陣列名有點類似於const指標。比如:

int a[10]=;

a就類似於const int * p = a;

另外,指標的sizeof就是4位元組(視系統而定,一般4位元組);陣列名的sizeof就是這個陣列的整個size。

比如:sizeof(p) = 4; sizeof(a) = 10*sizeof(int);

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

8樓:匿名使用者

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

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

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

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

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

經驗之談,樓樓加分啊

9樓:匿名使用者

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

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

10樓:匿名使用者

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

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

11樓:不再猶豫

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

c語言中用指標表示陣列和用陣列名錶示陣列的區別? 100

12樓:八千漢字

如果你是說你註釋那裡

改成 int *cpointer;

int c_count = 0;

如果是這樣的話 那就是 cpointer並沒有具體指向的空間換成int arr[100];

int *cpointer = arr;

int c_count = 0;

這樣就好了 指標有了具體的指向了

13樓:名很難記

s=(char *)malloc(100*sizeof(char));/*主函式內 改為-《後沒有報錯,但不是很懂你的**怎麼測試*/

if(isdigit(c))//某函式內

/*原 主函式只申請了一個指標s 且沒有分配記憶體 現在卻將其當成陣列使用,沒問題麼? 個人觀點,我也不是很懂*/

現在c語言用什麼編譯器比較好,自學C語言用什麼編譯器比較好

windows下,vc linux gcc 自學c語言用什麼編譯器比較好 編譯器不是最重要的,重要的是你想在哪個平臺上開發 以及你想要實現的功能是什麼。一般嵌入式程式設計大多使用gcc編譯器,尤其是gcc交叉編譯工具,比如arm linux gcc csky linux gcc等,編譯器版本根據實際...

求一個比較新的C編譯器,C 編譯器哪個比較好

現在比較通用的有vc dev c 等,這些編譯器都很好用。也有一些冷門的,編譯時會有跳出 卡死等毛病。不要貪圖新。c 編譯器哪個比較好 windows下的常見c 程式設計環境如下 最常用的c 程式設計環境包括 不僅 1 微軟的vs系列。微軟的東西總是回大而全,裝上後。答經常會發現要的東西找不到,不要的東西全...

現在學習c語言都是用什麼編譯器,在windows環境下,用什麼做C語言編譯器比較好

windows下 經典的 vc 6.0,為什麼不推薦vs 2013等系列呢?因為vs系列執行起來對機器要求比較高 vc6.0相對功能算全了 對學習c語言來講 而且相對vs系列佔用資源少!linux下 gcc 經典的 啊 還有clang 關於clang 你多瞭解點 會喜歡上他的 他的錯誤 警告做的比g...