教你认识指针(一)

#include <iostream>
using namespace std;
#include <stdlib.h>
#include <stdio.h>
//间接赋值
//通过形参改变实参
int demo02(int *p/*out*/)
{
	int rv=0;
	*p=1000;
	return rv;
}


int demo01()
{
	int rv=0;
	int iNum=0;
	int *p=NULL;
	iNum=1;
	p=&iNum;
	*p=100;//通过*形参 == 间接地改变实参的值
	printf("inum--->%d\n",iNum);
	demo02_gaozhijiao(p);
	//调用函数间接赋值函数调用时,形参传给实参,用实参取地址,传给形参,在被调用函数里面用*p,来改变实参,把运算结果传出来。
	//指针作为函数参数的精髓。
	printf("inum--->%d\n",iNum);
	return rv;
}
//二级指针的应用
int demo04(char **p/*out*/)//通过二级指针去改变一级指针
{
	int rv=0;
	*p=(char *)0x500;//
	return rv;
}

int demo03()
{
	int rv=0;

	char * p=NULL;
	char ** p2=NULL;
	p=(char *)0x100;
	printf("inum--->%d\n",p);//输出的是他的地址
	//printf("inum--->%d\n",*p);//里面没有内容啊。。。
	p2=&p;
	*p2=(char *)0x200;


	printf("inum--->%d\n",p);

	demo04_gaozhijiao(&p);
	printf("inum--->%d\n",p);

	return rv;
}



int main ()
{
	char *p1=NULL;
	char **p2=NULL;
	char ***p3=NULL;
	char ****p4=NULL;
	
	//demo01();
     demo03();
	 demo01();

	//stack上分配4个字节的内存空间,
	/*
     1、多少级指针对于编译器有意义吗?
	 我们所说的多少级指针的依据是什么?
	 理解指针的概念,不在于机械的char**p++这样的概念。
	 而在于指针所指向的内存空间模型是几维的,就是对内存空间如何进行解释

	 我们应该按照内存分配的概念去理解
	 struct Teacher
	 {
	 int *p1=NULL;//
	 int **p2=NULL;//malloc两次
	 };


	 2、三级指针用在,malloc不知道所要打包的数据有多大的时候,或者函数二返回的数据给函数一使用的时候。为了防止在stack上定义的被清空,无法返回出去的时候 ,其他的时候禁止使用malloc。

	 3、指针的数据类型跟指针没关系,只是告诉操作系统如何去解释指针所指向的内存空间。

	 4、 char***p3=null;
	 char**p2=null;
	 p3=&p2;//
	 *p3=0x1100;//这时候p2这个指针变量改变了。

	 5、看指针是做输入还是输出?什么是输入什么是输出呢?
	 先说什么是输入,一般情况下在主调函数里面分配内存,被调用函数使用,一般称为输入。
	 如果在被调用函数里面分配内存,供主调用函数使用,则成为输出。


	 6、作业如上:各级指针的做函数参数的推演过程以及典型错误
	*/
	



	 system("pause");
	 return 0;
}

/*
1、除了做底层应用,其他的慎用malloc,因为不free会发生内存泄露,而且要是紧跟break或者return 就free不了了
2、int*p=null只要申请一个四字节的内存空间,
3、程序运行内存分析的能力。训练接口的封装和设计能力
4、函数内变量的内存运行分布
5、数据类型是解释内存空间的
6、指针也是一种数据类型,指针的数据类型是指所指内存空间的数据类型。
int func(char);//按8字节去处理内存空间的数据
int func(char *a);//按字符串去处理
7、指针变量和他所指向的内存块是不同的概念。
8、野指针?*p=null只是定义了指针变量,没有分配空间
9、间接赋值是指针存在的最大意义。
10、改变变量有两种方法直接和间接赋值。
int demo04_gaozhijiao(char **p/*out*/)//间接,通过二级指针去改变一级指针
{
	int rv=0;
	*p=(char *)0x500;//直接
	return rv;
}
int demo02_gaozhijiao(int *p/*out*/)
{
	int rv=0;
	*p=1000;//间接
	return rv;
}
11、间接赋值存在的意义是什么?
     1、*p++=*s++//等号左边表示改变地址,就是指向的内容,等号右边表示取里面的内容。
	 2\指针做函数参数的时候,可以作为输入,也可以作为输出,是输入还是输出,主要是看在主调函数中分配内存(输入)还是在被调函数中分配内存(输出)。
12、给指针p赋值p=p+1只会改变指针变量的值,不会改变所指向的内容,想改变内容用间接赋值!!int *p=&a;
13、给×p赋值只会改变所指向的内容的值,不会改变指针变量的值,
     *p=200;不会改变p的值。

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值