前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >指针与数组的关联3 --声明

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

作者头像
py3study
发布2020-01-13 12:32:21
8530
发布2020-01-13 12:32:21
举报
文章被收录于专栏:python3

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

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

test.c:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
char arr[] = "hello world";
char *p = "hahahahahaha

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

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

wKioL1ZPPpKz8LEoAAA_TGelu7c037.png
wKioL1ZPPpKz8LEoAAA_TGelu7c037.png

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

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

test.c

代码语言:javascript
复制
#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
wKiom1ZPSIWCFQxfAABAqXUF260808.png

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

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

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

(完)

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/08/05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档