概述
首先我们先来了解一下什么是指针,什么是数组:
指针:
先看这样一段代码:
int i=20;//定义一个整形变量i
int* p=&i;//定义一个指针变量p,把整形变量i的地址赋给p
什么是指针呢?
简单的说就是地址,那指针变量就是存放地址的。“ int * p” ,p是整型指针,其中的“ * ”说明 该变量是指针,“ int ”说明该指针所指的类型是int型。那“ char* p ”,说明该指针是字符型指针,该指针指向变量类型是“ char ”型。其它的道理一样。
那这个所谓的“指向”该咋理解?
指针的大小在32位平台上是4个字节,在64位平台上是8个字节。现在以32位平台为例,在内存里有4个字节的空间,然后这4个字节大小的空间命名为p,这四个字节的空间里面只能存储某个内存地址,即使你存入别的任何数据都将被当作地址处理。简而言之,指针p存放的某个变量的地址。对于(int *)整型指针变量,p里存的那个地址开始的4个字节只能存int型数据,因为int 占4个字节,对于(char *)字符型指针变量,p里存的那个地址开始的1个字节只能存char型数据,因为char只占1个字节。其它类似。
对于上面那个例子:因为 i 是整型,占四个字节,在计算机里1个字节给一个地址,指针变量p里存的是整型变量 i 的起始地址,那从这个地址开始的四个字节里存的就是20。看下面这和个图
数组:
对于数组,大家可以看看我写的这篇文章:https://blog.csdn.net/jsbgo201506010102/article/details/79808029
现在大家对指针和数组应该都不陌生,那指针和数组之间又有什么关系呢?数组指针和指针数组又有怎么区别的呢?
指针和数组之间没有任何关系!!!
指针就是指针,指针变量在32位平台下永远占4个字节,在64位平台下永远占8个字节。其值为某一内存的地址。
数组就是数组,其大小与元素的类型和个数有关。
我们通过指针和数组的定义、声明来说明指针和数组的不同:
如果说指针和数组是一样的,那我定义一个数组,把它声明成指针,或者定义一个指针,把它声明成数组,在使用时结果应该是一样。我们通过下面这段代码来说明问题。
1.定义成数组,声明成指针
//test.c
char arr[] = "abcdef";//数组的定义
//main.c
extern char* arr;//声明
int main()
{
printf("sn", arr);
return 0;
}
输出结果:
很显然,这是出问题了,是什么原因呢?我们来分析一下:
那我们就要把它声明成指针,那在使用时怎样才能让结果正确呢?
我们只需要找到那个数组首元素的地址,也就是字符a的地址,而指针arr有4个字节,这四个字节存着“abcd”,那如何从4个字节里拿到a的地址呢?先对arr取地址&arr(因为arr是char* ,那所得的地址是char**),我们要打印字符串,所需的是char*,所以在强制类型转换(char*)&arr。
printf("sn", (char*)&arr);
2.定义成指针,声明成数组
//test.c
char* p = "abcdef";//指针的定义
//main.c
extern char p[];//声明
int main()
{
printf("%sn", p);
system("pause");
return 0;
}
来看结果:
结果出现了我们不认识的东西,我们来分析一下原因:
那我们就要把它声明成数组,那在使用时怎样才能让结果正确呢?
要想输出那个字符串,那得拿到首元素a的地址,左边定义的p里存的就是a的地址,这个地址有四个字节。那就要让右边的p拿到四个字节,先强制类型转换(int *)p,然后解引用*(int*)p ,然后就拿到四个字节,但这四个字节是整形,我们需要的是字符指针,最后在强制类型转换(char *)*(int *)。或者也可以*(char **)p。
printf("%sn",(char *)*(int*)p;
printf("%sn", *(char**)p);
数组指针和指针数组的区别:
指针数组:首先它是一个数组,数组里的每个元素都是指针。
数组指针:首先它是一个指针,它指向一个数组。
int *p[10];
这是一个指针数组,“[ ]”的优先级比“*”高,p先和“[ ]”结合,构成一个数组,数组名为p,int* 是数组的每个元素,也就是这个数组每个元素时指针类型。
int(*p)[10];
这是一个数组指针,p先和“*”结合,构成一个指针,int [10]说明该支持指向的是一个含有10个元素的数组,这10个元素都是int型。
最后
以上就是威武树叶为你收集整理的浅谈指针与数组之间的恩恩怨怨的全部内容,希望文章能够帮你解决浅谈指针与数组之间的恩恩怨怨所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复