1. 指针是什么?
指针就是内存的地址,指针变量就是能够保存内存地址的变量。
一般数据类型变量名指的是这个数据所代表的值。
2. 如何定义指针?
在最开始声明一个指针变量的时候,为了表明是一个指针变量,要在变量名前加“*”(间接引用符),在后续的使用中则不用加“*”了
下面两种写法是等价的
//一个变量 int a; //第一种,分开写 int *t; t=&a //第二种 int *t=&a
前面的数据类型表明了指针指向的是什么样的数据类型
3. 具体用法
3.1:通过指针剪间接修改变量值
还是用上面的例子,下面两种写法是等价的
a=200;//直接修改 *t=200;//间接修改
其实把*t看作a也行
3.2:指针的初始化
int *t=&a; //指针类型 *指针变量名 = &变量 //注意指针指向的数据类型要和指针类型一致
3.3:注意事项
指针数据只能使用四种值
1. 0值 常量 表达式
int a,b=0; int *t=a;//错,不能把整形数据赋给指针变量 int *t=b;//错,b是个变量 int *t=400;//错,非0 int *t=null;//对,null可以看作0 int *t=0;//对,是0,是个常量
2. 不能指向不同的数据类型
3. 直接将相同类型的指针互相赋值
4. 类似于数组的,在下一个地址处有有效的数据类型的
4. 无效的指针类型
1. 0值指针
刚才说过0可以赋值给一个指针变量,但这是无效的
2. 指针未初始化且未赋值时
这种指针很明显是无效的
3. 指针指向的变量的内存空间已经被释放了(迷途指针)
同上
三种类型都是没有指向一个确定的对象,因此无效
5. 指针的运算
指针的运算一般只有在连续的储存空间中才有意义(比如数组)
(否则没有指向一个确定的对象,这个指针就是无效的啊)
int x[10],*p=&x[5]; p+1//指向x[5]的后一个int变量 p-1//指向x[5]的前一个int变量 也可以加减一个变量 int n=1; p+n,p-n都是可以的
自加自减也可以
两个指针可以相减(但是不能相加啊)
指针相减得到的值是这两个指针之间所有对象的个数
也可以比较大小(比较两个地址的大小关系)
6. const指针
第一种指针的定义:const 数据类型 *指针名
对于一个常量,我们可以用一个常量指针指向一个常量
(用变量指针编译都过不去)
相同的,一个常量指针也可以指向一个变量
但是,一个变量指针不能指向一个常量
一个常量指针也就代表了无法通过指针间接修改它所指向的值
因此一般用于函数,确保在函数中引用的值不会被改变
第二种指针 数据类型 const *指针名
它表明了这个指针指向的对象是不会改变的
因此,试图改变它指向的对象的操作都是非法的
但是要分开,这种指针可以间接改变它所指向的值
当使用带有const的指针时其实有两种意思。一种指的是你不能修改指针本身的内容,另一种指的是你不能修改指针指向的内容。听起来有点混淆一会放个例子上来就明白了。
第三种指针 const 数据类型 const *指针名
以此类推,这种指针是一种指向的对象不能够变化,也不能通过指针来修改对象的值的指针
原文地址:https://www.cnblogs.com/Salty-Fish/p/12327605.html