CC++——指针的运算

mac2025-12-16  7

1. 指针自增、自减运算

指针的自增自减运算是指针加减运算的特例。指针的自增或自减表示指针从当前位置向前或向后移动sizeof(数据类型)长度的存储单元。

#include <iostream> using namespace std; int main() { int *p, *q; //定义两个int类型的指针 int arr[8] = { 0, 10, 20, 30, 40, 50, 60, 70 }; //定义一个长度为8的int类型的数组 p = arr; //p指向arr的首地址,arr是数组arr[8]的名称,它所指向的就是arr[8]这个数组的首地址,所以此处不需要“&” q = &arr[5]; //q指向arr[5]的首地址,因为arr[5]是arr中的一个元素,而不是地址,因此需要取地址符“&” //如果“=”右边是地址,就不需要取地址符 //如果“=”的右边是一个元素,就需要取地址符 printf("数组arr的首地址:%d \t 数组arr的首地址处存放的值:%d\n",arr, *arr); printf("数组arr[0]的地址:%d \t 数组arr[0]的值:%d\n", &arr[0], arr[0]); printf("指针p指向的地址:%d \t 指针p指向地址存储的值%d\n", p, *p); printf("指针q指向的地址:%d \t 指针q指向地址存储的值%d\n", q, *q); printf("int长度:%d\n",sizeof(int)); return 0; }

我们来看一下这段代码的运行结果,首先定义了两个int类型的指针,之后定义了一个长度为8的int类型的数组arr[8],之后让p指向数组的首地址arr,q指向了数组的低6个元素a[5],接下来看一下输出结果,我们发现,数组arr的首地址,就是arr[0]的地址,其中存储的数就是我们定义的数组arr中的第一个值——0,接下来看q,q指向了数组的低6个元素a[5],我们在最后输出了int类型的长度为4,因此,q指向的地址为数组的第一个元素的地址再加上5个int类型的长度,即19920788+5*4=1992808,搞清楚这些之后,再来看指针的自增、自减运算。

#include <iostream> using namespace std; int main() { int *p; //定义两个int类型的指针 int arr[8] = { 0, 10, 20, 30, 40, 50, 60, 70 }; //定义一个长度为8的int类型的数组 p = arr; //p指向数组arr的首地址 printf("p=arr \t 指针p指向的地址:%d \t 指针p指向地址存储的值%d\n", p, *p); p++; //让指针p增加1,即p指向下一个整型数据,因此p指向数组元素arr[1] printf("p++ \t 指针p指向的地址:%d \t 指针p指向地址存储的值%d\n", p, *p); * p++; //先取p指向变量arr[1]的值,然后使指针p增加1,因此p指向arr[2] printf("* p++ \t 指针p指向的地址:%d \t 指针p指向地址存储的值%d\n", p, *p); (*p)++; //读取p指向的变量arr[2]的值,然后变量arr[2]自增1 printf("(*p)++ \t 指针p指向的地址:%d \t 指针p指向地址存储的值%d\n", p, *p); *++p; //先使指针p增加1,指向a[3],然后读取p指向元素的值 printf("*++p \t 指针p指向的地址:%d \t 指针p指向地址存储的值%d\n", p, *p); ++*p; //将指向元素a[3]自增1 printf("++*p \t 指针p指向的地址:%d \t 指针p指向地址存储的值%d\n", p, *p); return 0; }

2.两指针相减

当两个指针指向同一数组时,两个指针的相减才有意义。两个指针相减的结果为一个整数,表示两个指针之间数组元素的个数;两指针相加没有意义。

#include <iostream> using namespace std; int main() { char str[] = "123456789"; //长度为10的字符数组,最后一个为'\0' int arr[] = { 1,2,3,4,5,6,7,8,9,0 }; //长度为10的整型数组 int *pi , *qi; //定义两个int类型的指针 char *pc, *qc; //定义两个char类型的指针 pi = &arr[0]; qi = &arr[9]; pc = &str[3]; qc = &str[8]; cout << "arr[0]和arr[9]之间有" << (qi - pi) << "个元素" << endl; cout << "str[3]和str[8]之间有" << (qc - pc) << "个元素" << endl; return 0; }

3.指针数组

指针数组是以指针变量为元素的数组,指针数组的每个元素都是同一类型的指针变量。 数据类型标识符 * 指针数组标识符[常量]

#include <iostream> using namespace std; int main() { char str[] = "Helloworld!"; char *p[11]; //定义了一个指针数组,其中有个元素,每个数组元素都是一个char类型的指针 for (int i = 0; i < 11; i++) { p[i] = &str[i]; } for (int i = 0; i < 11; i++) { cout << *p[i] << endl; } return 0; }

4.数组指针

数组指针是指向数组的指针。它表明定义的首先是一个指针,然后才是什么类型的指针。 数据类型标识符 ( 指针名)[常量]* 如 int (*p)[5];

最新回复(0)