每日一学30
指针3指针与指针的运算
C指针算术运算的第2种形式是:
指针——指针
要注意,指针与指针之间的算术运算没有加运算,只有减运算。并且,只要当两个指针都指向同一个数组中的元素时,才允许将一个指针减去另一个指针。
两个指针相减的结果的类型是ptrdiff_t,它是一种有符号整数类型。减法运算的值是两个指针在内存中的距离(以数组元素的长度为单位,而不是以字节为单位),因为减法运算的结果将除以数组元素类型的长度。
例如,如果p1指向array而p2指向array,那么p2-p1的值就是j-i的值。
如果两个指针所指向的不是同一个数组中的元素,那么它们之间相减的结果是未定义的。就像如果把两个位于不同街道的房子的门牌号码相减不可能获得这两所房子间的房子数一样。程序员无法知道两个数组在内存中的相对位置,如果不知道这一点,两个指针之间的距离就毫无意义。
运算符 & 和 *
如果指针的值是某个变量的地址,通过指针就能间接访问那个变量,这些操作由取址运算符 "&" 和间接访问运算符 "*" 完成。
单目运算符 "&" 用于给出变量的地址。例如:
int *p, a = 3;
p = &a;
将整型变量a的地址赋给指针p,使指针p指向变量a。也就是说,用运算符 "&" 去变量a的地址,并将这个地址值作为指针p的值,使指针p指向变量。
注意指针的类型和它所指向变量的类型必须相同。
例题:取地址运算和间接访问示例
#include<stdio.h>
int main(void)
{
int a = 3, *p; //定义整型变量a和整型指针p
p = &a; //把变量a的地址赋给指针p,即p指向a
printf("a = %d, *p = %d\n", a, *p); //输出变量a的值和指针p所指向变量的值
*p = 10; //对指针p所指向的变量赋值,相当于对变量a赋值
printf("a = %d, *p = %d\n", a, *p);
printf("Enter a:");
scanf("%d",&a);
printf("a = %d, *p = %d\n", a, *p);
(*p)++;
printf("a = %d, *p = %d\n", a, *p);
return 0;
}
例题分析:
第4行的"int a = 3, *p"和其后出现的*p,尽管形式是相同的,但两者的含义完全不同。的4行定义了指针变量,p是变量名,*表示其后的变量是指针;
而后面出现的*p代表指针p所指向的变量。本例中,由于p指向变量a,因此,*p和a的值一样。
再如表达式*p = *p + 1、++*p和(*p)++,分别将指针p所指向变量的值加1。而表达式*p++等价于*(p++),先取*p的值作为表达式的值,再将指针p的值加1,运算后,p不再指向变量a。
同样,在下面这几条语句中:
int a = 1, x, *p;
p = &a;
x = *p++;
指针p向指向a,其后的语句x = *p++,将p指向的变量a的值赋给变量x,然后修改指针的值,使得指针p不再指向变量a。
指针在C语言中是一个非常强大且重要的概念。以下是对上述内容的总结和解释:
指针与指针的运算:
- 指针减指针:仅当两个指针指向同一数组的元素时,才能进行减法运算。
- 这运算的结果是两个指针之间的距离(以元素个数为单位)而不是字节。
- 减法的结果类型为`ptrdiff_t`。
- 不能对指向不同对象的指针进行减法运算,否则结果未定义。
运算符 & 和 *:
- `&`(取址运算符):用于获取变量的地址。例如:`p = &a;` 将变量`a`的地址赋给指针`p`。
- `*`(间接访问运算符):用于访问指针指向的变量的值。例如:`*p`表示指针`p`所指向的变量。
- 指针类型必须与其所指向变量的类型匹配。
例题分析:
- `int *p, a = 3;`:定义整型变量`a`和指针`p`,`p`将用于保存一个整型变量的地址。
- `p = &a;`:指针`p`指向变量`a`。
- `*p = 10;`:通过指针`p`修改变量`a`的值为10。
- `(*p)++`:通过指针`p`增加变量`a`的值。
- 重要区别:`*p++`和`++*p`:
- `*p++`:先使用指针指向的值,然后将指针递增,结果指针不再指向原变量。
- `++*p`:直接增加指针指向的变量的值。
如果还有更多的问题或需要进一步的解释,请继续提问!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 加入。学习
页:
[1]