不再害怕指针(极力推荐!)

很多学习C语言或c++的朋友都很怕指针,但是指针却是那么多的重要。今天,鄙人讲一下对指针的认识,让您溅笑了。

何为指针,指针就是一个地址,内存地址。int a=100; int *p=&a; p是一个指针,这个指针指向了一个整数a, p就是一个地址,里面存放着变量a

说得更形象一点吧,指针跟变量的关系就像是钥匙和抽屉的关系,抽屉(指针)是用来打开(指向)抽屉(变量)的。而抽屉里面的东西,就是*p,p所指向的变量的值。

任何语言都显得那么苍白,下面看看代码吧:

#include<iostream>
#include<string>
using namespace std;
int main(){
	int chouti;//一个抽屉
	chouti=10086;//抽屉里面放了一张电话卡
	int *yaoshi=&chouti;//钥匙,并且说明了钥匙是对应哪个抽屉的
	
	cout<<yaoshi<<endl;   //输出抽屉的地址
	cout<<&chouti<<endl;  //输出抽屉的地址
	cout<<*yaoshi<<endl;  //取出抽屉里面的电话卡
	system("pause");
	return 0;
}

结果如下:


有人老是混淆 char *,string等,下面简单解析一下,

大家都知道char是C/C++内置类型,而string是c++的一个类,两者是有区别的,一个是字符'用' '括着,一个是字符串,用" "括着。

特别注意,字符数组最后面一个元素是'\0',是用来判断结束的标志

这样子对指针是不是有那么点印象了,不用怕,跟着我的脚步,下面来到指针之初体验:

#include<iostream>
#include<string>
using namespace std;
int main(){
	char c='h';    //定义一个字符
	char *p=&c;    //初始化指针
	cout<<*p<<endl;//解析p

	char *pp=new char;     //分配内存
	*pp='e';         //给解析指针赋值的时候,一定要先new一个
	cout<<*pp<<endl;

	char *ppp="hello world"; //初始化一个指针
	cout<<ppp<<endl;        //输出结果,有的人就奇怪了,为什么解析不用*的,因为ppp指向的是数组,ppp就一个数组,用数组即可
	
	char cc[]="hello wrold"; //定义一个字符数组
	char *pppp=cc;          //数组名就是数组的首地址  这个时候cc=&cc[0];
	cout<<pppp<<endl;		//输出结果

	string s="I love Cplusplus";
	char *ppppp=&s[0];      //因为string是有字符构成的,但是string又不是char,所以首地址要这样赋值,不能char *ppppp=s;类型不匹配
	cout<<ppppp<<endl;    //输出结果

	system("pause");
	return 0;
}


这样子,够清晰吗,一定得动手调试一下,看看内存地址,看看解析,方能理解其中的关系。

总结一下上面的代码,就一句话, type *指针是一个数组(自己酝酿一下)

接下来,我们来看看二维指针,乃至多维。

二维指针就跟二维数组一样,二维数组是一维数组的数组,那么相对应的,二维指针就是一维指针的指针,或者说是指向数组的指针。

初始化二维数组的时候,第二维是给定大小,因为要知道第二维,才能给数组分配内存。而初始化二维指针也是一样的道理:

int a[][3]={{1,2,3},{4,5,6}};这是正确的初始化数组的方式 那么a就代表着&a[0][0]

下面初始化二维指针 int (*p)[3]=a;这样就初始化了二维指针,(*p)[3]一定要这样写,不能漏掉括号,优先级问题,自己翻翻书,当然这不是唯一初始化二维(多维)数组的方式

看看代码的实现吧。

#include<iostream>
#include<string>
using namespace std;
int main(){
	int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};//初始化二维数组
	int (*p)[4];                                   //指向数组的指针
	for(p=a;p!=a+3;++p){                            //循环输出内容
		for(int *q=*p;q!=*p+4;++q){                 //*p指向的是首行地址
			cout<<*q<<"\t";                          //输出结果
		}
		cout<<endl;
	}
	system("pause");
	return 0;
}


自个琢磨琢磨,要弄明白喔;

下面定能让你茅舍顿开:

#include<iostream>
#include<string>
using namespace std;
int main(){
	int a=10086;
	int *p=&a;      //一维指针
	int **pp=&p;     //二维指针是一维指针的指针,这下明白了吧,下面也一样的道理
	int ***ppp=&pp;
	int ****pppp=&ppp;
	// ... 任意维都行
	cout<<****pppp<<endl;
	cout<<***ppp<<endl;
	cout<<**pp<<endl;
	cout<<*p<<endl;
	system("pause");
	return 0;
}

结果你已经猜到了,没错就是可爱的10086:

这回你没有白来吧,再用一个程序巩固一下吧:

#include<string>
using namespace std;
int main(){
	char **mychr;
	char chr[]={"I love cplusplus"};
	char chrs[]={"I love cplusplus"};
	char *p=chr;
	mychr=&p;

	if(strcmp(*mychr,chrs)==0)
	{
		cout<<"equal"<<endl;
	}
	else
	{
		cout<<"not equal"<<endl;
	}
	
	cout<<&chr[0]<<endl;
	cout<<&p<<endl;
	cout<<&(*mychr)<<endl;
	cout<<**mychr<<endl;
	system("pause");
	return 0;
}

仨字:不解释。
体会一下,输出的那些都是什么,代表什么含义。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值