指针和数组的定义与声明

xiaoxiao2021-02-28  60

所谓定义,就是让它不存在的时候要让他存在。 所谓声明,就是让它不知道的时候被知道。

看代码: test.c文件 extern char arr[]; extern char *p; int main() { printf("%s\n", arr); printf("%s\n", p); system("pause"); return 0; } main.c文件: char arr[] = "abcdefg"; char *p = "abcdefg";

结果:

在mian.c中extern表示arr和p是外部文件定义的变量,在使用的时候就去其他的模块中寻找。也可以理解成,声明一个外部的变量。通过对结果的分析,我们知道:声明的就是一个变量本身,声明和定义作用于同一块空间。

换一种方式写代码:

(1)定义数组,声明指针

main.c文件 char arr[] = "abcdefg"; test.c文件 extern char *arr; int main() { printf("%s\n", arr); system("pause"); return 0; } 这个结果会挂掉, 为什么?

当main.c中定义char arr[]为数组,保存在空间中为‘61’‘62’‘63’‘64’‘65’‘66’‘67’ 在test.c中声明char *arr为指针,四个字节,打印的时候,拿到的是“61626364”这样的地址,这样的地址指的哪谁也不知道,所以就有访问出错。 如何修改呢? main.c文件 char arr[] = "abcdefg"; test.c文件 extern char *arr; int main() { printf("%s\n", (char *)&arr); system("pause"); return 0; } 将arr的地址拿出来(“61626364”),然后强制类型转换成 char *,就可以得到字符‘a’的地址了。 (2)定义指针,声明数组 main.c文件 char *p = "abcdefg"; test.c文件 extern char p[]; int main() { printf("%s\n", p); system("pause"); return 0; } 这个有输出什么? 运行多边,发现是随机值。

为什么随机值?

先将“abcdefg”中‘a’的地址放在*p中,声明是将p声明成数组,打印时p单独存在,就为数组名,表示首元素的地址,这个地址指向*p的首元素,但是*p的首元素(“abcdefg”中‘a’的地址)是什么我们不知道,所以输出的是随机值。

那么这要怎么修改呢? main.c文件 char *p = "abcdefg"; test.c文件 extern char p[]; int main() { printf("%s\n", (char *)*(int *)p); system("pause"); return 0; } 先将p强制类型转化成(int *),就是从p开始往后拿四个字节,然后 * 取到四个字节的内容,由于拿到的是整型,所以在强制类型转化成char *就可以拿到 “abcdefg”中‘a’的地址
转载请注明原文地址: https://www.6miu.com/read-2627527.html

最新回复(0)