公司网站搜索不到,西宁市企业建站专业,wordpress4.5图片偶尔不显示,广州论坛网站导语在这里我们做种强调的是在两个文件中#xff0c;定义为数组声明为指针和定义为指声明为数组的这辆中情况。那么我们就需要两个源文件test.c和main.c。定义为数组#xff0c;声明为指针test.cchar arr[] abcdef;main.c#define _CRT_SECURE_NO_WARNINGS 1
#in… 导语在这里我们做种强调的是在两个文件中定义为数组声明为指针和定义为指声明为数组的这辆中情况。那么我们就需要两个源文件test.c和main.c。定义为数组声明为指针test.cchar arr[] abcdef;
main.c#define _CRT_SECURE_NO_WARNINGS 1
#include stdio.h
#include stdlib.hextern char *arr; //声明int main()
{printf(%s\n, arr);system(pause);return 0;
}
就会出现以下的错误就会出现读取位置发生访问冲突首先我们需要知道的是定义和声明使用的是同一块空间我们在test.c中定义为数组在main.c中使用不管声明为数组还是指针都是用的是这一块空间。这里将声明的arr当为指针取出来的是四个字节的值然后在打印字符串时就会将这四个字节的值作为一个地址去寻找我们可以先来看看代码呈现。我们会发现“64636261”不是dcba的ASSCII码吗所以我们就知道了它为何地址访问出错。看下图这里指针去访问了四个字节的空间然后取出了dcba将dcba当做地址码去取出字符造成地址访问出错。那我们如何在定义为数组、声明为指针的情况下取出数组中所存的字符串要取出字符串就必须知道首元素’a’的地址上述的描述不就让我们知道了arr中存放的就是64636261相当于dcba,我们对arr取地址就相当于取到了abcd的地址我们在对这个地址强制转换为char*类型不就取到了一个字节’a’的地址。字符串知道了首元素地址打印就很方便啦main.c#include stdio.hextern char *arr;int main()
{//printf(%s\n, arr);printf(%s\n, (char*)arr);system(pause);return 0;
}
定义为指针声明为数组test.cchar *p abcdef;
main.c#define _CRT_SECURE_NO_WARNINGS 1
#include stdlib.h
#include stdio.hextern char arr[]; //这里只是说他是一个数组不需要填写数组个数int main()
{printf(%s\n, p);system(pause);return 0;
}
运行之后就会发现呀我的程序运行出来是随机值不对呀我明明将它存放进去了。首先我们就得清楚这个数组里面存放的是什么定义为指针然后指向了字符串”abcdef”这里指针里面就存的是字符串首元素的地址声明为数组定义为指针大小只有四个字节所以数组的大小也只有四个字节指针中存放的是字符串首元素的地址数组中存放的是字符串首元素的地址所以打印出来就是乱码了。图解如下图所示那我们如何在定义为指针、声明为数组的情况下取出指针中所指向的字符串我们要找到字符串就要将指针所存放的四个字节一次取出来因为字符数组一次只能读一个字节* 所以我们需要把它强转为int*取出后我们需要知道它里面的内容就必须把它解引用取出四个字节的地址(int )p最后我们要找到’a’的地址就必须强转为char*才能取出’a’的地址。main.c#define _CRT_SECURE_NO_WARNINGS 1
#include stdlib.h
#include stdio.hextern char p[]; //这里只是说他是一个数组不需要填写数组个数int main()
{printf(%s\n, (char*)*(int*)p);system(pause);return 0;
}
总结定义和声明使用的是同一块空间指针大小是4个字节数组大小不一定指针和数组不一样转自https://blog.csdn.net/meng_lemon/article/details/80642938 回复「 篮球的大肚子」进入技术群聊回复「1024」获取1000G学习资料