迴歸基礎 —— 指針和數組的定義與聲明

一、序

之前在編程中時刻謹記數組或者指針的申明和定義要保持一致,即

/*數組定義與聲明*/
// file.c
char arr[] = "abcdef"; 

//file.h
char arr[];

/*指針定義與聲明*/
// file.c
char *arr = "abcdef";

//file.h
char *arr;

但其中的緣由也一直沒有去想、去想清楚,今天看到一篇文章https://blog.csdn.net/meng_lemon/article/details/80642938,提供瞭解答。這邊也做一下記錄,正如標題說講,迴歸基礎,瞭解底層。

二、核心知識點

無論聲明與定義如何變化,需要記住的是聲明和定義使用的是同一塊空間。

比如 char * arr, 其代表指向字符串的指針,其變量值爲一個地址,這個地址指向一個常量字符串;

char arr[],其代表一個字符數值,其對應一塊字符空間;

而最終生成的可執行檔或者map 存儲的arr的含義是變量定義所代表的含義。

通過這些分析,可以看到這兩者之間還是有差別的。

三、具體例子

[參見https://blog.csdn.net/meng_lemon/article/details/80642938]

3.1 定義爲數組,聲明爲指針

/*test.c*/
char arr[] = "abcdef";

/*main.c*/
#include <stdio.h>
#include <stdlib.h>

extern char *arr;   //聲明

int main()
{
    printf("%s\n", arr);  
    system("pause");
    return 0;
}

其映射關係如下所示,

arr 實際是一塊字符空間, 而main.c 中的arr 卻認爲是一個地址,所以錯誤地將字符數組的四個字節內容當做指針值,從而訪問了錯誤的內容。

3.2 定義爲指針,聲明爲數組

/*test.c*/
char *p = "abcdef";


/*main.c*/
#include <stdlib.h>
#include <stdio.h>

extern char arr[];  //這裏只是說他是一個數組,不需要填寫數組個數

int main()
{
    printf("%s\n", p);
    system("pause");
    return 0;
}

其映射關係如下:

相似的,p實際是一個指針,指向字符串。 而main.c 中的p 卻認爲是一個字符數組。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章