一.指针定义
先把《c++ primer plus》中的描述记录下,等理解后再来看此,其实很好理解。
- 一种特殊类型的变量——指针,用于存储值的地址。因此,指针名表示的是地址。*运算符被称为间接值运算符(或解除引用运算符),将其应用于指针,可以得到该地址处存储的值。
人家书中还给了个例子
- 假设manly是一个指针,则manly表示的是一个地址,而*manly表示存储在该地址处的值。
二.上代码
代码如下
int s=1;
cout<<"数据s的地址 &s="<<&s<<endl;
cout<<"数据s的值 s="<<s<<endl<<endl;
cout<<"指针的声明"<<endl;
int *a=&s;
cout<<"指针a的地址 : &a="<<&a<<endl;
cout<<"指针a的地址中值(这个值是一个地址) : a= "<<a<<endl;
cout<<"指针a中存的地址所指向的数据的值 : *a="<<*a<<endl<<endl;
cout<<"把指针中存的地址赋值给另外一个指针:可见指针a和b地址不同,但是指针地址中存放的地址相同,当然里面地址所指向的数据也相同"<<endl;
int *b=a;
cout<<"&b="<<&b<<endl;
cout<<"b= "<<b<<endl;
cout<<"*b="<<*b<<endl;
代码输出如下:
数据s的地址 &s=0076FA8C 数据s的值 s=1
指针的声明 指针a的地址 : &a=0076FA80 指针a的地址中值(这个值是一个地址) : a= 0076FA8C 指针a中存的地址所指向的数据的值 : *a=1
把指针中存的地址赋值给另外一个指针:可见指针a和b地址不同,但是指针地址中存放的地址相同,当然里面地址所指向的数据也相同 &b=0076FA74 b= 0076FA8C *b=1
三.上图纸
通过 *a 和 s 获取到的数据一样,但它们的运行过程稍有不同:a 只需要一次运算就能够取得数据,而 *p 要经过两次运算,多了一层“间接”。
四. char* p和 char *p 和(char*)p
1.char* p和 char *p 是一样的,都是定义一个char类型的指针。 2.(char*)p:表示把p强制转换为char类型的指针。
五.const char* p和char* const p
const在谁前面,谁的固定的。有同事也称为:左定值,又定址 1.const char* p:指针指向的值是固定的,地址是可变的; 2.char* const p:指针指向的值是可变的,地址是固定的;
六.读取访问权限冲突
- 在使用未初始化的指针时,会抛出:读取权限冲突的异常。还会给出诸如 0XCCCCCCCC、0xCDCDCDCD的异常提示,解决方案很简单:给个初始值就可以了
参考: 1.C语言指针变量的定义和使用(精华)http://c.biancheng.net/view/1991.html 2.关于 char* p和 char *p,困惑,https://bbs.csdn.net/topics/370193550 3.https://zhidao.baidu.com/question/498324155965589724.html 4.https://zhidao.baidu.com/question/217041918.html 5.C++读取访问权限冲突引发异常问题https://blog.csdn.net/gabriel1217/article/details/110083837
|