笔记内容已上传个人博客,推荐在个人博客网站观看!
指针和数组
当看到这个笔记的时候,你可能会感觉到奇怪,为什么数组和指针会有联系???其实它们俩不仅有联系,而且联系密切!
最后,你会惊讶到:”数组不就是指针吗!()“
虽然数组和指针关系密切,好基友,但数组绝不是指针
,他们只是鸽们而已!
①它俩为什么是鸽们?
首先我们要再次了解下它俩的定义
数组:数组是用于储存多个相同类型数据的集合。
指针:指针相当于一个变量,但是它和不同变量不一样,它存放的是其它变量在内存中的地址。
数组和指针的最密切的联系在于,数组名本质上是一个指针常量,它指向数组中第一个元素的地址。因此,可以通过将数组名作为指针来访问数组中的各个元素。下面用一个例子来演示下。
#include <stdio.h>
int main()
{
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr;//此处没有&是因为数组名本身就是一个首地址(数组存放第一个元素的地址),此处就是将数组的地址给指针存放。
//下面是利用for循环将通过指针间接访问数组的五个地址里面的元素
for (int i = 1; i <= 5; i++)
{
printf("第%d个地址内存放的元素是:%d\n",i,*p);
p++;//访问下一个地址
}
return 0 ;
}
对于上面代码的打印结果如下
由此可以看到i,我们可以将数组内的元素都可以通过指针进行访问,大概的解释如下。
解释:
指针存储了某个内存地址,通过对指针进行操作(如通过算术运算符来增加或减少指针的值),可以访问该地址对应的内存单元。对于数组,指针指向数组的第一个元素,通过对指针进行递增操作,可以依次访问数组中的每个元素。
②数组名的真面目
其实对于以上肯定还是有点疑惑的点是,为什么数组名是个地址?
下面我将用到scanf函数来解释下
#include <stdio.h>
int main()
{
int a;
int* p = &a;
char b[114514];
printf("请输入一个整数:");
scanf("%d", &a);
printf("你输入的是%d\n", a);
printf("请再输入一个整数:");
scanf("%d", p);
printf("你输入的是%d\n", a);
printf("请最后用英文评价这串代码:");
scanf("%s", b);
printf("你输入的最后一串英文是%s\n", b);
return 0;
}
对于以上的代码我们可以很明显看到用指针以及用数组之后,scanf函数内并未用到取地址操作符"&",这样就可以证明数组名就是一个存放数据的地址了!以下为输出结果
如果通过以上的例子还不能理解,我们不妨看下个例子。
#include <stdio.h>
int main()
{
int a[114514] = { 1,2,3 };
char b[114514] = "DOG";
float c[114514] = { 1.1,2.2,3.3 };
double d[114514] = { 1.1,2.2,3.3 };
for (int i = 0; i <= 2; i++)
{
printf("a的第%i个地址是:%p\n", i + 1, a[i]);
printf("b的第%i个地址是:%p\n", i + 1, b[i]);
printf("c的第%i个地址是:%p\n", i + 1, c[i]);
printf("d的第%i个地址是:%p\n", i + 1, d[i]);
printf(" \n");
}
return 0;
}
我们知道%p是用来打印地址的,那么以上的打印结果会怎么样呢?我们来看下面的输出结果
通过以上的几个例子,我们大概也知道了数组名的真面目了。
数组名其实是地址!
③指向数组的指针
如果用一个指针指向数组,应该怎么做呢?
char a[114514];
char *P;
p=a;//形式1
p=&a[i]//形式2,i为数组的下标
④指针的运算
其实对于最开始的那串代码,我们或许可能会存在一个疑惑。
那就是为什么p++为访问下一个地址?
那是因为当指针指向数组元素的时候,我们可以对指针变量进行加减运算,这样做的意义相当于指向距离指针所在位置向前或向后第n个元素。这个不管数组是什么类型都是成立的
!因为p+1并不是简单地将地址加1,而是指向数组的下一个元素。
对比标准的下标法访问数组元素,这种使用指针进行间接访问的方法叫做指针法
。
我们继续用个例子来运用指针运算的同时,而且来进一步了解指针和数组的关系。
#include <stdio.h>
#include <string.h>//因为要使用字符串函数,所以必须引用此头文件
int main()
{
const char* a = "I love you!";
//字符串变量前面加上const这样做是为了避免通过指针变量修改字符串常量的内容,因为字符串常量是不可修改的,否则就会警告。
int i, len;
len = strlen(a);
for (i = 0; i < len; i++)
{
printf("%c", a[i]);//这里可以充分证明其实指针某种意义上也是数组
}
return 0;
}
以上代码的输出结果如下所示
通过这个输出结果可以发现,指针其实也意外的很像数组。