指针的加减算术运算-指针加常数意味着什么?
一、重点
指针是一个大小固定为4个byte的变量,不管是什么类型的指针大小都是固定的,它存放的只是一个地址信息。
指针变量加1,即表示指针变量指向下一个数据元素的首地址。这并不是在原地址值的基础上加1。至于真实的地址加了多少,要看原来指针指向的数据类型是什么。
真实的地址计算原则上为:指针P+1 = 指针P + sizeof(指针的类型) * 1
二、指针操作分析——“p++”、”*p++”、”*p=*p+1”、”(*p)++”
#include <iostream>
using namespace std;
int main()
{
int *p;///声明一个指针变量
int n[20];///创建一个简单的数组用于观察指针
for (int i=0;i<20;i++)
{
n[i] = i*10;
}
p= &n [2];///用指针p指向数组中某个元素
///【1】初始状态
cout << "【1】初始状态" << endl;
cout << " p = " << p << endl;
cout << "*p = " << *p << endl << endl;
/* 输出结果:
【1】初始状态
p = 0x6dfeb0
*p = 20
*/
///【2】p++的情况
p++;
cout << "【2】p++的情况" << endl;
cout << " p = " << p << endl;
cout << "*p = " << *p << endl << endl;
p--;///复原
/* 输出结果:
【2】p++的情况
p = 0x6dfeb4
*p = 30
*/
///【3】*p++的情况
*p++;
cout << "【3】*p++之后" << endl;
cout << " p = " << p << endl;
cout << "*p = " << *p << endl << endl;
*p--;///复原
/* 输出结果:
【3】*p++之后
p = 0x6dfeb4
*p = 30
*/
///【4】*p=*p+1的情况
*p=*p+1;
cout << "【4】*p=*p+1之后" << endl;
cout << " p = " << p << endl;
cout << "*p = " << *p << endl << endl;
*p=*p-1;///复原
/* 输出结果:
【4】*p=*p+1之后
p = 0x6dfeb0
*p = 21
*/
///【5】(*p)++的情况
(*p)++;
cout << "【5】(*p)++之后" << endl;
cout << " p = " << p << endl;
cout << "*p = " << *p << endl << endl;
/* 输出结果:
【5】(*p)++之后
p = 0x6dfeb0
*p = 21
*/
return 0;
}
/*
四种操作的效果总结起来如下:
"p++"的效果:指针向下移动一个单位(对于int变量的数组,指针移动了4字节),指针内的内容并未变化。
"*p++"的效果:指针向下移动一个单位(对于int变量的数组,指针移动了4字节),指针内的内容并未变化。与"p++"效果相同!
"*p=*p+1"的效果:指针不移动,但指针所指的数据有+1效果。
*p=*p+1的效果:指针不移动,但指针所指的数据有+1效果。与"*p=*p+1"效果相同!
结论是:
若要对指针进行移位操作,只需对指针变量本身进行加减。
若要对指针所指的内容进行操作,需要将“取内容的*”和指针变量放在一个括号里(比如"(*p)"),这样才能对指针所指的内容进行操作。
*/
四种操作的效果总结起来如下:
“p++”的效果:指针向下移动一个单位(对于int变量的数组,指针移动了4字节),指针内的内容并未变化。
“*p++”的效果:指针向下移动一个单位(对于int变量的数组,指针移动了4字节),指针内的内容并未变化。与”p++”效果相同!
“*p=*p+1”的效果:指针不移动,但指针所指的数据有+1效果。
*p=*p+1的效果:指针不移动,但指针所指的数据有+1效果。与”*p=*p+1”效果相同!
结论是:
若要对指针进行移位操作,只需对指针变量本身进行加减。
若要对指针所指的内容进行操作,需要将“取内容的*”和指针变量放在一个括号里(比如”(*p)”),这样才能对指针所指的内容进行操作。
原文链接:https://blog.csdn.net/yibeiyese/article/details/80883037
还没有评论,来说两句吧...