浅谈指针与数组之间的恩恩怨怨

首先我们先来了解一下什么是指针,什么是数组:

指针:

先看这样一段代码:

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("s\n", arr);
    return 0;
}

输出结果:
这里写图片描述
很显然,这是出问题了,是什么原因呢?我们来分析一下:
这里写图片描述
那我们就要把它声明成指针,那在使用时怎样才能让结果正确呢?
   我们只需要找到那个数组首元素的地址,也就是字符a的地址,而指针arr有4个字节,这四个字节存着“abcd”,那如何从4个字节里拿到a的地址呢?先对arr取地址&arr(因为arr是char* ,那所得的地址是char**),我们要打印字符串,所需的是char*,所以在强制类型转换(char*)&arr。

printf("s\n", (char*)&arr);

2.定义成指针,声明成数组

//test.c
char* p = "abcdef";//指针的定义
//main.c
extern char p[];//声明
int main()
{
    printf("%s\n", p);
    system("pause");
    return 0;
}

来看结果:
这里写图片描述
结果出现了我们不认识的东西,我们来分析一下原因:
这里写图片描述
那我们就要把它声明成数组,那在使用时怎样才能让结果正确呢?
   要想输出那个字符串,那得拿到首元素a的地址,左边定义的p里存的就是a的地址,这个地址有四个字节。那就要让右边的p拿到四个字节,先强制类型转换(int *)p,然后解引用*(int*)p ,然后就拿到四个字节,但这四个字节是整形,我们需要的是字符指针,最后在强制类型转换(char *)*(int *)。或者也可以*(char **)p。

printf("%s\n",(char *)*(int*)p;
printf("%s\n", *(char**)p);

数组指针和指针数组的区别:

   指针数组:首先它是一个数组,数组里的每个元素都是指针。
   数组指针:首先它是一个指针,它指向一个数组。

int *p[10];

   这是一个指针数组,“[ ]”的优先级比“*”高,p先和“[ ]”结合,构成一个数组,数组名为p,int* 是数组的每个元素,也就是这个数组每个元素时指针类型。
这里写图片描述

int*p)[10];

   这是一个数组指针,p先和“*”结合,构成一个指针,int [10]说明该支持指向的是一个含有10个元素的数组,这10个元素都是int型。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/jsbgo201506010102/article/details/80111864