关于指针的理解

 

先导知识

变量/变量名:就是一个名字,它和一个内存里的一块存储空间对应,对变量修改相当于修改对应存储空间里的存储的东西。

地址:用于在存储空间找到目标的“门牌号”。

存储单元:存储单元会有自己的地址,里面也会有存储的内容。

 

指针含义:

变量的地址即为该变量的指针,理解为地址(指针)指向了该变量,也就是通过地址(指针)可以找到该变量

如果一个变量专门用来存放另一个变量的地址(指针),则称它为指针变量

 

要搞清指针要从两方面

1. 计算机内部是怎样的过程

      1. int a=3; // 这是定义了一个类型为int的变量,a是变量名,同时也分配了一个int大小的存储空间,并在这个空间里存下了3的二进制内容,a就是这个存储空间的临时的“名字”,存储空间也有对应的地址,&a就可以取该到地址;

      2. int *p; // 这是定义了一个指向int类型的指针,p是变量名,同时也分配了对应的存储空间,这个空间用于存放地址,且地址必须是指向int类型的,p和上面的a一样是这个存储空间的临时的“名字”,*p是变量p存放的地址所对应的存储空间的值

     3. p = &a; // 首先p是一个专门存储int类型变量地址特殊变量,这样就把a变量对应存储空间的地址取出来放到p变量的存储空间了,后面p打印出来就是a变量对应存储空间的地址,*p相当于找p变量对应的存储空间存放的地址里所放的东西,那么*p打印出来就是3。

    4. (*p)++;// 变量p存放的是地址,这个地址对应这一个存储空间,这个空间存储的值可以用(*p)取到,(*p)++就是对这个值+1

2. 各种符号的结合优先级

  1. int p; //这是一个普通的整型变量 
  2. int *p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,然后再与int 结合,说明指针所指向的内容的类型为int 型.所以P是一个返回整型数据的指针 
  3. int p[3]; //首先从P 处开始,先与[]结合,说明P 是一个数组,然后与int 结合,说明数组里的元素是整型的,所以P 是一个由整型数据组成的数组 
  4. int *p[3]; //首先从P 处开始,先与[]结合,因为其优先级比*高,所以P 是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与int 结合,说明指针所指向的内容的类型是整型的,所以P 是一个由返回整型数据的指针所组成的数组 
  5. int (*p)[3]; //首先从P 处开始,先与*结合,说明P 是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P 是一个指向由整型数据组成的数组的指针 

 

  1. int **p; //首先从P 开始,先与*结合,说是P 是一个指针,然后再与*结合,说明指针所指向的元素是指针,然后再与int 结合,说明该指针所指向的元素是整型数据.由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更复杂的类型我们就不考虑多级指针了,最多只考虑一级指针. 
  2. int p(int); //从P 处起,先与()结合,说明P 是一个函数,然后进入()里分析,说明该函数有一个整型变量的参数,然后再与外面的int 结合,说明函数的返回值是一个整型数据 
  3. Int (*p)(int); //从P 处开始,先与指针结合,说明P 是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的int 结合,说明函数有一个int 型的参数,再与最外层的int 结合,说明函数的返回类型是整型,所以P 是一个指向有一个整型参数且返回类型为整型的函数的指针 
  4. int *(*p(int))[3]; //可以先跳过,不看这个类型,过于复杂从P 开始,先与()结合,说明P 是一个函数,然后进入()里面,与int 结合,说明函数有一个整型变量参数,然后再与外面的*结合,说明函数返回的是一个指针,,然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与*结合,说明数组里的元素是指针,然后再与int 结合,说明指针指向的内容是整型数据.所以P 是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数.

 

指针变量作为函数参数

#include <iostream>
using namespace std;
void add_point(int *p){
	(*p)++;
} 
void add(int p){
	p++;
} 
int main()
{
    int a = 3;
    cout<<"a="<<a<<"原始的变量a的值"<<endl;
    add(a); 
    cout<<"a="<<a<<"不使用指针在函数里对变量a加1,不会修改变量a的值"<<endl;
    add_point(&a);
    cout<<"a="<<a<<"使用指针作为函数参数可以在函数里修改变量a的值"<<endl;
    return 0;
}

 

指针引用数组

数组名不代表整个数组,只代表数组首个地址的元素地址,它是个地址。

#include <iostream>
using namespace std;
int main()
{
    int *p;
	int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} ;
	
	// 等价于 p = &a[0];	
	p = a;
	
	// 有三种遍历数组的方式
	for(int i=0; i< 10; i++)
		cout<<a[i]<<" "; 
	cout<<endl;
		
	for(int i=0; i< 10; i++)
		cout<<*(p+i)<<" "; 
	cout<<endl;
	
	for(p=a; p < a+10; p++)
		cout<<*p<<" "; 
	cout<<endl;
	
    return 0;
}

指针引用字符串

指针指向函数

返回指针值的函数

指针数组、多重指针

 

参考文献:

https://blog.csdn.net/liu100m/article/details/90731422

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值