指针与数组的关联3 --声明

2023-01-31 01:01:05 数组 指针 关联

    当我们在调用函数时,传递数组,就是把数组首元素的地址传递给函数,本质也就是给函数传递了一个指针变量。这时候我们会想那么数组是不是跟指针是一样的。为了验证,我们可以给一个项目里创建一个新的源文件,里面创建一个指针变量和是个数组,然后在另一个文件中用数组的方法声明指针,在用指针的方法声明这个数组进行调试,看下结果会如何。

    我们创建一个test.c文件用来编写主函数,test1.c创建变量编写内容如下:

test.c:

#include <stdio.h>
extern char*arr;
extern char p[];
int main()
{
printf("arr=%s\n", arr);
printf("p=%s\n", p);
return 0;
}

test1.c:

char arr[] = "hello world";
char *p = "hahahahahaha

    我们运行这个工程会怎么样呢,答案是当程序走到第一个printf时是会崩溃掉的,原因是我们在test1.c中定义的是一个数组,却在test.c中用指针声明引用,那么在*arr这个指针中存放的内容其实是

"hello world",这个字符串,指针能存放字符串吗?答案当然是不可以的,指针只能存放一个地址,当你放进去一个字符串,自然会在运行的时候发生内存错误。那么第二个printf输出的是不是hahahahahaha呢,其实也不是,第二个printf单独拿出来虽然可以正常运行,但是他的结果绝对不是我们想要的内容,其结果如下:

wKioL1ZPPpKz8LEoAAA_TGelu7c037.png

    是个乱码,这是因为我们输出的时候,拿到的是地址,把地址放到一个char类型的字符串里,等于把一个地址通过字符类型输出来了,自然是乱码。

    这里我们便清楚地看到了指针和数组的差别了吧。那如果想正常输出我们应该怎么办,做法如下:

test.c

#include <stdio.h>
extern char*arr;
extern char p[];
int main()
{
printf("arr=%s\n", (char*)(&arr));
printf("p=%s\n", (char*)(*(int*)p));
return 0;
}

 结果如下:

wKiom1ZPSIWCFQxfAABAqXUF260808.png 

  对于第一个,我们接收到的是一个指针,里面存放的却是一一个字符串,所以我们可以直接去arr的地址,然后强制类型转换为一个char型的指针变量进行输出。

    第二个接收到的是一个地址,我们知道地址所占字节是和int*类型所占字节是相等的,所以我们先把他转换成int*类型,然后解运用,拿到这个数组的内容(地址),把这个地址咱转换为char*型,这样我们就能用printf输出这个内容了。

    这个例子足以证明指针和数组的区别,指针的内容仅仅是个地址,而数组是个个数据的集合,他里面可以是地址(指针),也可以是其他类型的元素,而数组的地址其实也就个指针。所以说数组和指针其实有着本质的区别。希望大家注意。

(完)

如有不足或者错误之处,希望批评指正。

相关文章