C: (pointer) 陣列變數和指標的區別

wanglang3081發表於2013-12-10

1. sizeof(陣列)=陣列的長度; sizeof(指向陣列的指標)=指標大小4或8

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
                                                   
int main(int argc, const char * argv[])
{
                                                       
    char s[] = "hello world!";
    char *t = s;
                                                       
    printf("sizeof(s) is %li \n", sizeof(s));
    printf("sizeof(t) is %li \n", sizeof(t));
                                                       
    return 0;
}

output:

sizeof(s) is 13

sizeof(t) is 8

 

2. char s[]中的&s等價於s, 同是取char s[]的地址;

而char *t = s中的&t 不等同於 t, 取得是t指標變數本身的地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
                                      
int main(int argc, const char * argv[])
{
                                          
    char s[] = "hello world!";
    char *t = s;
                                          
    // &s == s; What is the address of the s array?
    printf("&s is %p \n", &s);
    // &t != t; What is the address of the t variable?
    printf("&t is %p \n", &t);
                                          
    return 0;
}

output:

&s is 0x7fff5fbffa2b

&t is 0x7fff5fbffa20

 

3. 宣告指標, 記憶體會分配空間, 所以指標可以重新賦值; 而陣列變數和陣列元素公用地址, 所以如果重新賦值, 則產生編譯錯誤.

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
                          
int main(int argc, const char * argv[])
{
                              
    char s[] = "hello world!";
    char *t = s;
                              
    s = t; // Error: Array type is not assignable
                              
    return 0;
}

相關文章