回归基础 —— 指针和数组的定义与声明

一、序

之前在编程中时刻谨记数组或者指针的申明和定义要保持一致,即

/*数组定义与声明*/
// 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 却认为是一个字符数组。

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