C语言指针和数组的联系(帮助初学者大概了解指针和数组的联系)


笔记内容已上传个人博客,推荐在个人博客网站观看!

指针和数组 | 洛希的智慧之殿堂 (luoxi.work)

指针和数组

当看到这个笔记的时候,你可能会感觉到奇怪,为什么数组和指针会有联系???其实它们俩不仅有联系,而且联系密切!

最后,你会惊讶到:”数组不就是指针吗!()“

虽然数组和指针关系密切,好基友,但数组绝不是指针,他们只是鸽们而已!

①它俩为什么是鸽们?

image-20221212152036972

首先我们要再次了解下它俩的定义

数组:数组是用于储存多个相同类型数据的集合。

指针:指针相当于一个变量,但是它和不同变量不一样,它存放的是其它变量在内存中的地址。

数组和指针的最密切的联系在于,数组名本质上是一个指针常量,它指向数组中第一个元素的地址。因此,可以通过将数组名作为指针来访问数组中的各个元素。下面用一个例子来演示下。

#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 ;
}

对于上面代码的打印结果如下

image-20221212184844675

由此可以看到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函数内并未用到取地址操作符"&",这样就可以证明数组名就是一个存放数据的地址了!以下为输出结果

image-20221212191255210

如果通过以上的例子还不能理解,我们不妨看下个例子。

#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是用来打印地址的,那么以上的打印结果会怎么样呢?我们来看下面的输出结果

image-20221212193146236

通过以上的几个例子,我们大概也知道了数组名的真面目了。

数组名其实是地址!

③指向数组的指针

如果用一个指针指向数组,应该怎么做呢?

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;
}

以上代码的输出结果如下所示

image-20221212200942364

通过这个输出结果可以发现,指针其实也意外的很像数组。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值