在指针算术中,要与指针相加或相减的整数不是解释为地址更改,而是解释为要移动的元素数。
#include <stdio.h> int main(void) { int array[] = {1, 2, 3, 4, 5}; int *ptr = &array[0]; int *ptr2 = ptr + sizeof(int) * 2; /* wrong */ printf("%d %d\n", *ptr, *ptr2); return 0; }
此代码在计算分配给的指针时会进行额外的缩放ptr2。如果sizeof(int)为4(这是现代32位环境中的典型值),则表达式表示“ 8个元素在array[0]”之后,该值超出范围,并调用未定义的行为。
要ptr2指出之后的2个元素是什么array[0],只需添加2。
#include <stdio.h> int main(void) { int array[] = {1, 2, 3, 4, 5}; int *ptr = &array[0]; int *ptr2 = ptr + 2; printf("%d %d\n", *ptr, *ptr2); /* "1 3" will be printed */ return 0; }
使用加法运算符的显式指针算法可能会造成混淆,因此使用数组下标可能会更好。
#include <stdio.h> int main(void) { int array[] = {1, 2, 3, 4, 5}; int *ptr = &array[0]; int *ptr2 = &ptr[2]; printf("%d %d\n", *ptr, *ptr2); /* "1 3" will be printed */ return 0; }
E1[E2]与(*((E1)+(E2)))(N1570 6.5.2.1,第2段)相同,并且&(E1[E2])等效于((E1)+(E2))(N1570 6.5.3.2,脚注102)。
或者,如果首选指针算术,则将指针强制转换为寻址不同的数据类型可以允许字节寻址。但是要小心:字节序可能会成为一个问题,转换为“字符指针”以外的类型会导致严格的别名问题。
#include <stdio.h> int main(void) { int array[3] = {1,2,3}; // 4字节* 3分配 unsigned char *ptr = (unsigned char *) array; // 无符号字符仅占用1字节 /* * Now any pointer arithmetic on ptr will match * bytes in memory. ptr can be treated like it * was declared as: unsigned char ptr[12]; */ return 0; }
C++ 指针 指针是一个用数值表示的地址。因此,您可以对指针执行算术运算。可以对指针进行四种算术运算:++、--、+、-。 假设 ptr 是一个指向地址 1000 的整型指针,是一个 32 位的整数,让我们对该指针执行下列的算术运算: ptr++ 在执行完上述的运算之后,ptr 将指向位置 1004,因为 ptr 每增加一次,它都将指向下一个整数位置,即当前位置往后移 4 个字节。这个运算会在
指针变量保存的是地址,而地址本质上是一个整数,所以指针变量可以进行部分运算,例如加法、减法、比较等,请看下面的代码: 运行结果: 从运算结果可以看出:pa、pb、pc 每次加 1,它们的地址分别增加 4、8、1,正好是 int、double、char 类型的长度;减 2 时,地址分别减少 8、16、2,正好是 int、double、char 类型长度的 2 倍。 这很奇怪,指针变量加减运算的结果跟
C 语言的指针常常被人们认为是 C 语言中的灵魂所在,可以完成很多高难度的操作。但是更多的人感觉 C 语言的指针的存在如同噩梦一般,因为稍不注意,就会引起灾难性的后果。 不管你是不是喜欢 C 语言中的指针,我们都要学习这种看起来很神奇的东西。因为指针这个概念不是 C 语言首创的,而是苏联的计算机科学家首创的。 1. 什么是指针? 指针是什么?这是来自灵魂的拷问。其实指针也是一种变量。我们之前也说过
指针逻辑运算符操作 指针变量存储的是一个地址,可以将它理解成一个数值。只是编译器会因为它是一个指针类型而将它读取作为一个地址。逻辑运算符包括>=,<=,==,!=;显然我们比较两个地址的数值的大小是没有意义的。 指针中最常用的逻辑操作符==,!=这两个是最常用的。 我们将0x0规定为地址的无效值,结束标志。NULL就是一个在C编译器中一个被定义好了的宏,它代表了这个无效地址。我们经常使用p==NU
本文向大家介绍C 语言指针变量的运算详解,包括了C 语言指针变量的运算详解的使用技巧和注意事项,需要的朋友参考一下 指针变量保存的是地址,本质上是一个整数,可以进行部分运算,例如加法、减法、比较等,请看下面的代码: 运行结果: &a=0X28FF44, pa=0X28FF44, pb=0X28FF30, pc=0X28FF2B &a=0X28FF44, pa=0X28FF48, pb=0X28FF
多级指针概述 我们将指针变量理解为一个存储地址的变量。如果这个地址里面存储的依然是地址,那么我们就可以定义一个二维指针。通过一个二维指针,我们通过两次寻址操作就可以找到这个值。 比如我们定义一个int **p;这是一个二维指针,当编译器看到p的时候,它知道这是一个指针变量,指向一个地址;当它看到第二个的时候,它知道指向的地址里面依然还是地址。如下图所示: 如果我们将p[0]和p[1]分别指向两个字