指针与数组的关联3 --声明
来源:互联网 发布:爱奇艺去广告优化版 编辑:程序博客网 时间:2024/05/25 13:34
当我们在调用函数时,传递数组,就是把数组首元素的地址传递给函数,本质也就是给函数传递了一个指针变量。这时候我们会想那么数组是不是跟指针是一样的。为了验证,我们可以给一个项目里创建一个新的源文件,里面创建一个指针变量和是个数组,然后在另一个文件中用数组的方法声明指针,在用指针的方法声明这个数组进行调试,看下结果会如何。
我们创建一个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单独拿出来虽然可以正常运行,但是他的结果绝对不是我们想要的内容,其结果如下:
是个乱码,这是因为我们输出的时候,拿到的是地址,把地址放到一个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;}
结果如下:
对于第一个,我们接收到的是一个指针,里面存放的却是一一个字符串,所以我们可以直接去arr的地址,然后强制类型转换为一个char型的指针变量进行输出。
第二个接收到的是一个地址,我们知道地址所占字节是和int*类型所占字节是相等的,所以我们先把他转换成int*类型,然后解运用,拿到这个数组的内容(地址),把这个地址咱转换为char*型,这样我们就能用printf输出这个内容了。
这个例子足以证明指针和数组的区别,指针的内容仅仅是个地址,而数组是个个数据的集合,他里面可以是地址(指针),也可以是其他类型的元素,而数组的地址其实也就个指针。所以说数组和指针其实有着本质的区别。希望大家注意。
(完)
如有不足或者错误之处,希望批评指正。
本文出自 “pawnsir的IT之路” 博客,请务必保留此出处http://10743407.blog.51cto.com/10733407/1715297
- 指针与数组的关联3 --声明
- 指针与数组--指针与数组的定义与声明
- 数组与指针的定义与声明
- 关于指针数组的声明
- 指针与数组关联导致的一些现象
- 指针与数组关联导致的一些现象
- C语言中的指针与数组的关联1
- C++ 3维数组指针声明的3种方式
- 指针的指针&指针的引用&复杂数组声明
- 指针数组、数组指针等变量的声明
- 指针数组和数组指针的声明形式
- 声明返回数组指针的函数
- 关于数组和指针的声明
- 数组指针的声明和引用
- 3.4.数组和指针的关联
- 数组的声明与初始化
- 数组的声明与使用
- 数组的声明与使用
- 一个数组中所有的数都是成对出现的只有一个或者两个数字是单独的,求这个数
- C语言中模拟实现strcpy,strstr,strcat函数
- C语言模拟实现memcpy,memmove函数
- C语言中的指针与数组的关联1
- C语言中指针与函数的关联2(数组的降级)
- 指针与数组的关联3 --声明
- 模拟实现C语言strncpy.strncat.strncmp函数
- C语言模拟实现memset.memcmp函数
- C语言用结构体写一个通讯录
- 提交Android代码的格式
- C语言实现C到C++的注释转换
- C语言实现顺序表的增删查改以及排序
- C++实现链表的进本操作及测试用例
- Android中的储存