2012-10-01 57 views
2

我瞭解到:C指針和數組

char ar[] 

是一樣的

char *ar 

這三個表達式:

char ar[][] //1 
char *ar[] //2 
char **ar //3 

是編譯器是一回事嗎?

這兩個表達式:

char ar[] 
char ar[][] 

將分配堆棧上的陣列中,而所有其他將分配它在堆上?

+2

我建議你閱讀[comp.lang.c FAQ](http://c-faq.com/),特別是第4,5和6部分。 – pmg

+1

這些都不會分配任何東西。沒有任何指定的數組維度,也沒有對malloc的調用。 –

+0

可能的重複[數組名是C中的指針?](http://stackoverflow.com/questions/1641957/is-array-name-a-pointer-in-c) –

回答

1

char ar[]只與char *ar相同ar是函數參數。否則它們分別是一個數組和一個指針。

char ar[][]是一個二維數組,如果ar不是函數參數。否則它是一個指向1-d數組的指針。如果ar不是函數參數,則它是一維指針數組。否則,它是一個指向指針的指針。

char **ar是指向指針的指針。

基本上,如果它是一個函數參數,它看起來像一個數組,它實際上是一個指向數組第一個元素的指針。數組不作爲函數參數全部傳遞。當您嘗試時,您將傳遞指向數組的第一個元素的指針,而不是數組本身。

在函數之外定義的所有變量既不在堆中,也不在堆棧中。它們是全局變量。

函數內部定義的所有變量(除static變量外)都在堆棧中。 static變量是全局的,它們既不在堆中,也不在堆棧中。 static只是將全局變量的可見性降低到功能或模塊範圍。

只有那些通過malloc()calloc()ralloc()明確分配的變量才生活在堆中。一些標準庫函數可以在堆中創建變量/對象,例如, fopen()

3
  1. 它們不一樣,除了函數原型。
  2. 再說一遍,它們不一樣,只是最後兩個在函數原型中是一樣的。
  3. 這與堆與堆棧分配無關。
3

char ar[]char *ar不是一回事。一個是數組,一個是指針。如果您的意思是:

char ar[10] = {0}; 

ar[0] == *ar 

那麼是的,它們都可以被解除引用並具有相同的結果。 關於堆與棧,不具有任何與你談論...變量分配出棧時,他們是靜態的東西:

char ar[10] = {0}; // this is allocated off the stack. 

變量分配關堆時它們是動態的:

char *a = malloc(10); //this is from the heap 
4
char ar[]; creates an array of characters when size is specified. 

char * ar; creates a character pointer. Might point to even a single or more characters. 

char ar[][]; when size is specified, creates a 2 dimensional array. 
char *ar[]; creates an array of character pointers 
char **ar; a pointer to pointer to character. 

當您分配內存靜態諸如

char a[10]; // this goes on stack 

其中作爲

char *a = malloc(10); // this goes on heap and needs to be freed by the programmer 

甲或許常見的事情可能是您使用炭分配數組的數組**一個即的每個元素也是一個字符陣列。然後,可以使用語法a [x] [y]來訪問其中的任何一個元素。另一個區別是char * a是指針變量,即a可以被重新分配給另一個地址,其中as char a [ ]將返回指針常量,並且不能重新分配

1

1) 兩者都不相同,但在將數組傳遞給函數時,它被認爲是 指針。

2)

int ar[10][10] 

ar爲一個兩個維陣列10行,10列。

char *ar[] 

ar是包含'char'類型指針的數組。

char **ar 

ar是指向'char'類型的指針的指針。

3)

char ar[20] 
char ar[10][10] 

既分配從堆棧存儲器中。要從堆中分配內存,那麼你將不得不使用動態內存分配概念。即:malloc。

希望這會有所幫助。 :)

0

事情是數組比指針包含更多的信息。您可以確定數組的大小,並且編譯器知道。例如,"Hello"的類型是const char [6]。注意大小。下面的代碼片段說明:

#include <stdio.h> 

int main() 
{ 
    const char array[] = "Hello"; 
    char* pointer = "Hello"; 
    printf("Array: %d - Pointer: %d", sizeof(array), sizeof(pointer)) 
    return 0; 
} 

在我的系統,the snippet gives the following output

Array: 6 - Pointer: 4 

對於數組,它是罰款編譯器知道大小,因爲它們是在編譯時總是已知的。然而,指針通常在運行時確定,這就是爲什麼它們通常與動態分配的內存相關聯的原因。

真正簡化的思考方式是數組是「整體」,而指針只是對第一個元素的引用。