【C语言】指针关系运算|指针和数组

举报
謓泽 发表于 2023/09/29 14:03:34 2023/09/29
【摘要】 【C语言】指针关系运算|指针和数组

💣 指针关系运算

for 循环遍历数组元素全部初始化为 0

第①种代码 

#define Macro 5
int value[Macro];
int* p;
for(p = &value[macro];p > &value[0];)
{
    *--p = 0;
}

第②种代码

#define Macro 5
int value[Macro];
int* p;
for(p = &value[macro - 1];p > &value[0];p--)
{
    *p = 0;
}

实际上绝大多数的代码编译器上是可以顺利完成的

然而写代码的时候我们还是应该避免第二种写法,因为标准并不保证它是可行的

💣 标准规定

允许指向数组元素的指针与指向数组最后一个元素的那个内存位置的指针进行比较,但是不允许指向第一个元素之前的那个内存位置的指针去进行比较,第二种就会导致数组越界。

 ⚔ 指针和数组

数组名是首元素的地址,如下代码所示↓

#include<stdio.h>
int main(void)
{
	int arr[10] = { 0 };
    //这两种情况是等价得
	printf("%p\n", &arr);
	printf("%p\n", &arr[0]);
	return 0;
}

代码运行结果所示↓

  • 004FFAD8 - 数组名
  • 004FFAD8 - 数组名首元素地址

正是因为数组名是首元素的地址,所以我们可以这样去理解。如下代码所示↓

#include<stdio.h>
int main(void)
{
	int arr[10] = { 0 };
	int* p = arr;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%p--《======》--%p\n", &arr[i], p + i);
	}
	return 0;
}

上面的代码:p 是首元素的地址,首元素的地址 p + i,产生的就是下标为 arr[i] 的这个元素的地址。它们两个是一模一样的。

运行结果🖊

0x7ffe5a4ed550--《======》--0x7ffe5a4ed550
0x7ffe5a4ed554--《======》--0x7ffe5a4ed554
0x7ffe5a4ed558--《======》--0x7ffe5a4ed558
0x7ffe5a4ed55c--《======》--0x7ffe5a4ed55c
0x7ffe5a4ed560--《======》--0x7ffe5a4ed560
0x7ffe5a4ed564--《======》--0x7ffe5a4ed564
0x7ffe5a4ed568--《======》--0x7ffe5a4ed568
0x7ffe5a4ed56c--《======》--0x7ffe5a4ed56c
0x7ffe5a4ed570--《======》--0x7ffe5a4ed570
0x7ffe5a4ed574--《======》--0x7ffe5a4ed574

如果这个时候要用指针遍历数组首元素的下标的话那也是可以的,此时就可以通过解引用来找到下标 i 的元素,从而 i 放进去,再把每个元素所打印出来。

#include<stdio.h>
int main(void)
{
	int arr[10] = { 0 };
	int* p = arr;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*(p + i) = i;
		printf("%d ", *(p + i));
	}
	return 0;
}

运行结果🖊

0 1 2 3 4 5 6 7 8 9 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。