我瞭解到:C指針和數組
char ar[]
是一樣的
char *ar
這三個表達式:
char ar[][] //1
char *ar[] //2
char **ar //3
是編譯器是一回事嗎?
這兩個表達式:
char ar[]
char ar[][]
將分配堆棧上的陣列中,而所有其他將分配它在堆上?
我瞭解到:C指針和數組
char ar[]
是一樣的
char *ar
這三個表達式:
char ar[][] //1
char *ar[] //2
char **ar //3
是編譯器是一回事嗎?
這兩個表達式:
char ar[]
char ar[][]
將分配堆棧上的陣列中,而所有其他將分配它在堆上?
char ar[]
只與char *ar
相同ar
是函數參數。否則它們分別是一個數組和一個指針。
char ar[][]
是一個二維數組,如果ar
不是函數參數。否則它是一個指向1-d數組的指針。如果ar
不是函數參數,則它是一維指針數組。否則,它是一個指向指針的指針。
char **ar
是指向指針的指針。
基本上,如果它是一個函數參數,它看起來像一個數組,它實際上是一個指向數組第一個元素的指針。數組不作爲函數參數全部傳遞。當您嘗試時,您將傳遞指向數組的第一個元素的指針,而不是數組本身。
在函數之外定義的所有變量既不在堆中,也不在堆棧中。它們是全局變量。
函數內部定義的所有變量(除static
變量外)都在堆棧中。 static
變量是全局的,它們既不在堆中,也不在堆棧中。 static
只是將全局變量的可見性降低到功能或模塊範圍。
只有那些通過malloc()
,calloc()
,ralloc()
明確分配的變量才生活在堆中。一些標準庫函數可以在堆中創建變量/對象,例如, fopen()
。
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
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) 兩者都不相同,但在將數組傳遞給函數時,它被認爲是 指針。
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。
希望這會有所幫助。 :)
事情是數組比指針包含更多的信息。您可以確定數組的大小,並且編譯器知道。例如,"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
對於數組,它是罰款編譯器知道大小,因爲它們是在編譯時總是已知的。然而,指針通常在運行時確定,這就是爲什麼它們通常與動態分配的內存相關聯的原因。
真正簡化的思考方式是數組是「整體」,而指針只是對第一個元素的引用。
我建議你閱讀[comp.lang.c FAQ](http://c-faq.com/),特別是第4,5和6部分。 – pmg
這些都不會分配任何東西。沒有任何指定的數組維度,也沒有對malloc的調用。 –
可能的重複[數組名是C中的指針?](http://stackoverflow.com/questions/1641957/is-array-name-a-pointer-in-c) –