美文网首页
cpp数组(四):指针运算

cpp数组(四):指针运算

作者: 浩波千里 | 来源:发表于2019-05-20 13:20 被阅读0次

作者邮箱:z_zhanghaobo@163.com
github相关: https://github.com/HaoboLongway/simple_examples

指针指向的是地址,与通常的整型有不同的含义,其也可以进行以下几类运算,但时刻要记得指针是一个地址值。
以下的例子以下例为前提:

int test_ar[5] = {0, 1, 2, 3, 4};
int * p1, *p2, *p3;
  1. 赋值
    可以把地址赋给指针,
p1 = p2 = p3 = test_ar;

这样,p1 p2 p3均指向test_ar的首元素

2.解引用
*运算符给出地址上储存的值,在之前基础上,执行以下代码

...
cout<<setw(8)<<"Value"<<setw(12)<<"Address"<<endl;
cout<<"*p1"<<setw(4)<<*p1<<setw(14)<<p1<<endl;
cout<<"*p2"<<setw(4)<<*p2<<setw(14)<<p2<<endl;
...

输出结果是

   Value     Address
*p1   0      0x6dfed0
*p2   0      0x6dfed0
  1. 取地址
    和所有变量一样,指针变量也有自己的地址和值.
cout<<&p1<<'\t'<<&p2<<'\t'<<&p3<<endl;

结果是:

0x6dfed0        0x6dfecc        0x6dfec8

我们还可以用一个指针指向p1等,如:

int ** couter_p;
couter_p = &p1;
...

此外,值得注意的一点是,p1是高地址,而p3是低地址,表明p1 = p2 = p3 = test_ar;初始化是由右向左进行的.

  1. 与整数相加
    可以用+运算符把指针和整数相加,或整数与指针相加。无论哪种情况,整数都会与指针所指类型大小(以字节为单位)相乘,然后把结果与初始地址相加,例如p1 + 3即与&test_ar[3]等价.
  2. 递增指针
    递增指针可以“就地”改变其地址值,进而移动到下一处。假如我们想要把test_ar里的数值全部打印出来,可以下面这样做
while(p1<(test_ar+5)){
        cout<<*p1<<'\t';
        p1++;
    }

结果如图

0       1       2       3       4
  1. 对指针的比较
    使用关系运算符可以比较两个指针的值,前提是两个指针都指向相同的数据类型,如前面的一行语句p1<(test_ar+5)就进行了比较
  2. 指针减去一个整数
    得到的结果仍是一个指针,与指针加上一个整数,这里就不赘述了
  3. 递减指针
    与递增指针同理
  4. 指针求差
    我们可以计算两个指针的差值,通常,求差的两个指针分别指向同一个数组的不同元素,通过计算可以求出两元素间的距离。差值的单位与数组类型的单位相同。例如,
p1=test_ar;
p2=test_ar;
p2++;
cout<<(p2-p1);

输出结果为1
这里输出的结果是数组test_ar相邻两元素距离是1,而字节占4个(int占4个字节),底层的地址差了4个字节。


题目4-1-1:
下列关于指针描述错误的是:
A. 在一定条件下,两个指针可以相加
B. 在一定条件下,两个指针可以进行关系运算
C. 在一定条件下,指针可以为空
D. 在一定条件下,两个指针可以相互赋值

答案:A
指针的运算不包括两指针间的加法,两指针可以进行关系运算(上面有示例),也可以相互赋值如int *p1, *p2, *tmp, a=1, b=2; p1 = &a; p2 = &b; tmp = p1; p1 = p2; p2 = tmp;其逻辑无异。


题目4-1-2:

其余文章:

数组与指针基础内容:

指针运算
认识指针
数组指针
数组定义及其初始化

相关文章

网友评论

      本文标题:cpp数组(四):指针运算

      本文链接:https://www.haomeiwen.com/subject/vayhzqtx.html