指针的应用和实际操作注意事项

#include <stdio.h> 
int main(void) 
{
int urn[5] = { 100, 200, 300, 400, 500 }; 
int * ptr1, *ptr2, *ptr3; 
ptr1 = urn; // 把一个地址赋给指针 
ptr2 = &urn[2]; // 把一个地址赋给指针 
// 解引用指针,以及获得指针的地址 
printf("pointer value, dereferenced pointer, pointer address:\n"); 
printf("ptr1 = %p, *ptr1 =%d, &ptr1 = %p\n", ptr1, *ptr1, &ptr1); 
// 指针加法 
ptr3 = ptr1 + 4; 
printf("\nadding an int to a pointer:\n"); 
printf("ptr1 + 4 = %p, *(ptr1 + 4) = %d\n", ptr1 + 4, *(ptr1 + 4)); 
ptr1++; // 递增指针 
printf("\nvalues after ptr1++:\n"); 
printf("ptr1 = %p, *ptr1 =%d, &ptr1 = %p\n", ptr1, *ptr1, &ptr1); 
ptr2--; // 递减指针 
printf("\nvalues after --ptr2:\n"); 
printf("ptr2 = %p, *ptr2 = %d, &ptr2 = %p\n", ptr2, *ptr2, &ptr2); 
--ptr1; // 恢复为初始值 
++ptr2; // 恢复为初始值 
printf("\nPointers reset to original values:\n"); 
printf("ptr1 = %p, ptr2 = %p\n", ptr1, ptr2); 
// 一个指针减去另一个指针 
printf("\nsubtracting one pointer from another:\n"); 
printf("ptr2 = %p, ptr1 = %p, ptr2 - ptr1 = %td\n", 
ptr2, ptr1, ptr2 - ptr1); 
// 一个指针减去一个整数 
printf("\nsubtracting an int from a pointer:\n"); 
printf("ptr3 = %p, ptr3 - 2 = %p\n", ptr3, ptr3 - 2); 
return 0; 
}

 

1.赋值;

可以把地址赋给指针。例如,用数组名、带地址运算符(&)的 变量名、另一个指针进行赋值。在该例中,把urn数组的首地址赋给了ptr1,变量ptr2获得数组urn的第3个元素 (urn[2])的地址。注意,地址应该和指针类型兼容。double类型的地址不能赋给指向int的指针,至少要避免不明智的类型转换。 C99/C11已经强制不允许这样做。

2.解引用:

运算符给出指针指向地址上存储的值

3.取址:和所有变量一样,指针变量也有自己的地址和值,就指针而言,&运算符给出指针本身的地址.

4.指针与整数相加:可以使用+运算符把指针与整数相加,或整数与指针 相加。无论哪种情况,整数都会和指针所指向类型的大小(以字节为单位) 相乘,然后把结果与初始地址相加。因此ptr1 +4&urn[4]等价。如果相加的结果超出了初始指针指向的数组范围,计算结果则是未定义的。除非正好超过数组末尾第一个位置,C保证该指针有效

5.递增指针:递增指向数组元素的指针可以让该指针移动至数组的下一个 元素。因此,ptr1++相当于把ptr1的值加上4(我们的系统中int4字节), ptr1指向urn[1](见图10.4,该图中使用了简化的地址变量不会因为值发 生变化就移动位置

 6.指针减去一个整数可以使用-运算符从一个指针中减去一个整数。指针必须是第1个运算对象,整数是第 2 个运算对象。该整数将乘以指针指向 类型的大小(以字节为单位),然后用初始地址减去乘积。所以ptr3 - 2&urn[2]等价,因为ptr3指向的是&arn[4]。如果相减的结果超出了初始指针所 指向数组的范围,计算结果则是未定义的。除非正好超过数组末尾第一个位 置,C保证该指针有效

7.递减指针:当然,除了递增指针还可以递减指针。在本例中,递减ptr3 使其指向数组的第2个元素而不是第3个元素。前缀或后缀的递增和递减运算 符都可以使用。注意,在重置ptr1ptr2前,它们都指向相同的元素urn[1]

8.指针求差:指针求差:可以计算两个指针的差值。通常,求差的两个指针分别指向同一个数组的不同元素,通过计算求出两元素之间的距离。差值的单位与数组类型的单位相同。例如,程序清单10.13的输出中,ptr2 - ptr12,意思是这两个指针所指向的两个元素相隔两个int,而不是2字节。只要两个指针都指向相同的数组(或者其中一个指针指向数组后面的第 1 个地址),C 都能保证相减运算有效。如果指向两个不同数组的指针进行求差运算可能会得出一个值,或者导致运行时错误。

9.比较:使用关系运算符可以比较两个指针的值,前提是两个指针都指向相同类型的对象。 注意,这里的减法有两种。 可以用一个指针减去另一个指针得到一个整数,或者用一个指针减去一个整数得到另一个指针。

在递增或递减指针时还要注意一些问题。编译器不会检查指针是否仍指向数组元素。C 只能保证指向数组任意元素的指针和指向数组后面第 1 个位置的指针有效。但是,如果递增或递减一个指针后超出了这个范围,则是未定义的。另外,可以解引用指向数组任意元素的指针。但是,即使指针指向数组后面一个位置是有效的,也不能保证可以解引用这样的越界指针。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值