有趣的C语言指针(三)——喂你吃颗语法糖?

这篇博客探讨了C语言中指针的语法糖,特别是数组下标运算符[]的使用。通过示例展示了p[i]和i[p]实际上等价于*(p+i),揭示了C语言中指针运算的内在机制。同时指出,虽然这些语法糖使得语言更简洁,但也可能给初学者带来理解难题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C指针中的语法糖


  吃药的时候药物太苦会无法下咽,需要装成小胶囊或小药片,外面甜甜的一层称为“糖衣”。在C语言指针中,因为其ugly的语法晦涩难懂当然也需要经过包装,这种行为,可以认为,“敌人对你扔了个语法糖(Syntactic sugar)”

数组中的下标运算符[]

简单点,我们直接上代码分析:

#include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{
	int *p_p,*p_l;
	int array[10];
	p_p = &array[0];
	cout <<p_p<<endl;
	p_l = array;
	cout <<p_l<<endl;
	return 0;
}

这里面,我们可以看到,定义两个指针指向同一个地址
这里写图片描述
有的人就会说了,嘿,这不是因为不加[]的数组名“ array”表示的是这个数组的初始元素的指针吗?偏激点的看,按照《征服C指针》的观点认为“这是错误的观点”。我们在来看下下面的一个例子:

#include <iostream>
using namespace std;
i
### C语言指针详解及语法格式 **一、指针的概念** 在C语言中,指针是一个非常重要的概念。它是一种变量,其值为另一个变量的地址——即内存位置。通过使用指针可以间接地访问该内存位置的数据。 例如: ```c int a = 10; int *p = &a; // p指向了整型变量a的位置 ``` 这里`*p`表示声明了一个名为`p`的指针,并将其初始化为存放`a`所在地址的值;而符号`&`则用于获取操作数的实际存储地址。 **二、基本语法格式** - **定义指针:** 指向特定数据类型的指针需要明确指出所关联的基本类型(如 int,char等)。形式如下: ```c 数据类型 *指针名; ``` 示例: - `float *fp;` 定义了一个指向浮点数(float)指针 fp - **取址运算符(&)** 和 解引用运算符(*) : 取址运算符(`&`)用于获得某个变量的地址;解引用运算符 (`*`) 则是用来读取或修改指针所指向内容。 示例如下: ```c float num=98.6F ; float *fptr=&num ;// fptr保存的是num这个实数变量所在的机器内部的具体物理空间编号(地址) printf("The value of 'num' is %f\n", *fptr );// 输出“ The value of ‘num’ is 98.60000” ``` - **赋给指针新地址:** 当希望将一个已存在的有效地址赋予某个已经定义好的空闲状态下的指针时,可以直接利用简单的赋值语句完成此过程。比如, ```c char ch='A'; char anotherCh='B'; char *cp=&ch; cp=&anotherCh;// 此处cp不再指向原来的字符'A',而是转向了新的目标'B' ``` - **数组指针的关系:** 数组的名字本质上就是一个常量指针 (pointer to constant),也就是说它可以看作是指向第一个元素的一个固定不变的指示器。因此,在很多情况下可以用对指针的操作代替直接针对数组进行处理的方式。 考虑下面的例子: ```c #include <stdio.h> void printArray(int arr[], size_t len){ for(size_t i=0;i<len;++i){ printf("%d ",*(arr+i)); } } int main(){ static const size_t SIZE=5uL; int myArr[SIZE]={42,-7,3,0,8}; printArray(myArr,SIZE);/* 这里传递给函数printArray() 的实际上传递的就是首地址*/ return 0; } ``` - **指针作为函数参数:** 如果想要改变传入到函数内的数值,则应该采用"按引用”方式进行调用而不是默认情况下的 "按值”。此时就需要运用到指针了! 下面展示了如何创建接收两个整形数字并交换它们之间顺序的功能模块: ```c void swapInts(int*x,int*y){ if(x&&y){ int tmp=*x; *x=*y; *y=tmp; } } /* 使用示例 */ int firstValue=-1,lastValue=~firstValue; swapInts(&firstValue,&lastValue); printf("After swapping: First Value=%d Last Value=%d\n",firstValue,lastValue); /* After swapping: First Value=-2 Last Value=-1 */ ``` 综上所述,掌握好上述知识点后就能够在日常编码过程中更加熟练地驾驭各种涉及指针的应用场景啦~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值