写在前面
最近在学习Qt时候,接触到了指针,由于作者对指针的了解微乎其微,所以系统的学习了一下,写了这篇文章,方便以后回忆指针
指针的注意和用处:
1.在调用函数的时候,你想修改这个变量的值,但是在调用函数时候只能局部修改,出了这个函数除非return重新赋值,很难修改,你可以传一个指针进去,然后通过作用到地址上的值,然后达到修改变量的功能
2.操作指针的时候记得注意指针的位置,比如在对指针进行p++的时候,就要注意指针的位置,注意什么时候是否需要将指针重新置于数组的开头*
初探指针
& 运算符"&“是一个返回操作数地址的单目运算符,叫做取地址运算符 就是变量前面加了一个&,你就可以得到这个变量存放的地址
* 运算符”*"是单目运算符,叫做指针运算符,作用是返回指定地址内的变量的值
作者认为指针就是一个地址,而这个地址存放的是另外变量的位置,解释不如上代码,比如下面代码
int i =0;
int *j = &i;
上面代码,第一行代码定义了一个int型的变量i,给i赋值为0,下面代码定义了一个int型的指针,赋值的时候用上&,&这个符号就是取地址,&i就是i地址,将其赋值给指针变量j。
继续上代码
int i = 1;
int *j = &i;
qDebug()<<"i"<<i;
qDebug()<<"&i"<<&i;
qDebug()<<"j"<<j;
qDebug()<<"&j"<<&j;
qDebug()<<"*j"<<*j;
qDebug()<<"&*j"<<&*j;
qDebug()<<"*&j"<<*&j;
qDebug()<<"**&j"<<**&j;
运行结果:
i 1
&i 0x7db9c4
j 0x7db9c4
&j 0x7db9b8
*j 1
&*j 0x7db9c4
*&j 0x7db9c4
**&j 1
由上面代码可以的知道j=&i,所以可以这样理解,j指向i,即j就是i的地址。而*j=i,加了*说明是取值
指针变量
指针变量的一般形式
定义:如果有一个变量专门用来存放另一变量的地址,称之为指针变量
类型说明 * 变量名 //*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明表示本指针变量所指向的变量的数据类型
指针变量的赋值
//1.
int a;
int *p =&a;
//2.
int a;
int *p;
p=&a; //不用加* 不能给指针变量赋常数
指针的算数运算
指针只有加法和减法两种算数运算
int i=10 ;
int *p ;
p=&i;
qDebug()<<"the result is:"<<p;
p++;
qDebug()<<"the result is:"<<p;
运行结果:
the result is: 0x7dbad4
the result is: 0x7dbad8
指针加减,并不是数值上+1和-1,而是在相加于你的变量类型,int占两个字节,所以由0x7dbad4->0x7dbad8,增加了两个字节。
一维数组与指针
对数组来说,数组名就是数组在内存中存储的首地址,指针变量用于存放变量的地址,也可以存放数组的首地址或数组元素的地址
指向数组元素的指针
1.
int *p a[10];
p=a;
2.
int *p,a[10];
p=&a[0];
使用指针访问数组
访问数组的地址
以上面代码为例子进行讲解,定义了一个a[10],这个数组是从a[0]~a[9],获取这个数组的地址有两种方法
第一种:使用取地址符号,也就是&, &a[0],就是获取数组第一个元素的地址,&a[0],&a[1]…
第二种:使用指针, p=a;将p指针指向了a的第一个元素的地址,于是p,p+1…对应&a[0],&a[1]的操作
访问数组的值
以上面代码为例子进行讲解,定义了一个a[10],这个数组是从a[0]~a[9],获取这个数组的值有两种方法
第一种:使用取地址符号,也就是*, *(a+0),就是获取数组第一个元素的地址,*a,*(a+1)…
第二种:使用指针, p=a;将p指针指向了a的第一个元素的地址,于是*p,*(p+1)…对应*a,*(a+1)的操作 初次之外 p[n]=*(p+n)
等待后续更新吧~~~~~~~~~~