解引用

来源:互联网 发布:编程界面matlab 编辑:程序博客网 时间:2024/05/23 23:54

【思想来源】

关于判断题:设p,q是指针,若p=q,则*p=*q。
的解题思考

【参考网址】

http://www.csdn123.com/html/itweb/20130824/79913_79908_79897.htm
http://www.cnblogs.com/StudyRush/archive/2011/02/26/1965557.html

【内容】

【简述】

一般说“*”是“取值”符号,对应的“&”是取地址符号,但是,如果对一个指针用“*”号,那还叫成取值就说不通了。
int a;
int * p = &a;是定义p为a的指针
int & b = a;就是声明b为a的引用
用p时要用->符号,或(*p).xxx来取成员
用b的话,就直接b.xxx来取成员

【详解】

C++中指针()、取地址(&)、解引用()与引用(&)的区别
一、初步了解——指针与取地址
先看程序:

#include <stdio.h>int main( ) {    int num = 7;    int *p = &num;    printf("%d 的地址是 %p\n", num, p);    return 0;}

上面int p定义了一个指向int类型指针p(我们使用符号把p声明为指针),并初始化p使其指向int类型的变量num,这里&num中的&是取地址操作符,当&作用于一个对象上时,它返回了该对象的地址。
所以这里指针p指向了num所对应的地址。(测试时输出了:7 的地址是 000000000064fe44)

二、如何使用指针?——解引用与指针赋值

#include <stdio.h>int main( ) {    int num = 7;    int *p = &num;    printf("数值%d所在的地址是 %p\n", num, p);    printf("指针p所指向的地址为 %p , 该地址上所保存的值为%d\n", p, *p);    *p = 100;    printf("指针p所指向的地址为 %p , 该地址上所保存的值为%d\n", p, num);    return 0;}

注意这里*操作符为解引用操作符,它返回指针p所指的地址所保存的值。
我们可以对*p赋值,从而改变p所指的地址上说保存的值,从而改变指向此地址的变量num的值。(num的值变为100)
(测试时输出结果:
数值7所在的地址是 000000000062FE44
指针p所指向的地址为 000000000062FE44 , 该地址上所保存的值为7
指针p所指向的地址为 000000000062FE44 , 该地址上所保存的值为100)

当然,我们也可以给指针p赋值,使其指向另外一个地址

#include <stdio.h>int main( ) {    int num = 7, another = -5;    int *p = &num;    p = &another;    printf("%d\n", *p);//-5    return 0;}

(测试时输出结果:-5)
三、引用

从某种意义上来说,引用完全有别于上面说介绍的内容:

#include <stdio.h>int main(void) {    int val = 7, val2 = 999;    int &refval = val, &refval2 = val2; ///引用必须要初始化,使其绑定到一个变量上    printf("%d %d\n", val, refval);    ///修改引用的值将改变其所绑定的变量的值    refval = -12;    printf("%d %d\n", val, refval);//-12,refval的值和val一样    ///将引用b赋值给引用a将改变引用a所绑定的变量的值,    ///引用一但初始化(绑定),将始终绑定到同一个特定对象上,无法绑定到另一个对象上    refval = refval2;    printf("%d %d\n", val, refval);//999    return 0;}

(测试时输出结果:
7 7
-12 -12
999 999

四、补充
a)指向指针的指针:

#include<cstdio>int main(void) {    int val = 7;    int *p = &val;    int **p2 = &p;///**声明一个指向指针的指针    printf("val的值为%d %d",*p,**p2);///**p2为两次解引用,可看做*(*p2)    return 0;}

(测试时输出结果:val的值为7 7)
由于指针也要占用内存空间存放其值,所以我们也可以定义一个指向指针的指针。

b)指针与数组:
指针和迭代器非常像,我们可以说指针就是数组的迭代器:

#include <stdio.h>int val[100];int main( ) {    for (int i = 0; i < 100; ++i) {        val[i] = i;    }    int *p = val;///等价于int *p = &val[0];    ///数组的变量名就是一个指针    printf("%d\n", *p); ///指针p指向val的第一个元素,即val[0]    int t = 100;    while (t--) {        ///可以直接对指针进行加减运算,就和迭代器一样        printf("%d\n", *(p++));///输出0~99    }    ///指针可以做差:    int *p2 = &val[10], *p3 = &val[20];    printf("%d\n", p3 - p2); //10    printf("%d\n", p2 - p3); //-10    ///还可以比比较大小:    printf("%d\n", p2 < p3 ? p3 - p2 : p2 - p3); //10    return 0;}

对于多维数组,只要把指向指针的指针理解好了就行

#include<cstdio>int val[100][100];int main(void) {    val[2][1] = 666;    ///如何用指针取出val[2][1]?    printf("%d", *(*(val + 2) + 1));    return 0;}

【反汇编查看】

http://www.cnblogs.com/StudyRush/archive/2011/02/26/1965557.html

1 0