c语言指针,简单一句话指针就是地址

简单一句话,指针就是地址

int *p3 = 100;

如果是直接赋值 int类型的给指针会报错:

 invalid conversion from ‘int’ to ‘int*’ 

 

0:网购的地址,通过这个地址找到你,

程序的地址,通过地址来操作变量,这个地址有一个叫法叫做指针,java 里面把地址就叫做引用

 

 

 

1:内存的单位是字节,例如一个256MB的机器,有256*1024*1024 字节的存储单位,每个字节都有一个对应的地址

通过该地址可以找到该块内存,就像我们的通讯地址一样

 


2:每一个变量由若干个字节组成,例如:int age = 20 由 4个字节组成,变量中第一个字节的地址称为变量的地址

 

 

#include <stdio.h>

int main(int argc,const char *argv[]){
	int age = 20;
	printf("size=%lu\n",sizeof(age));
	printf("%p\n",&age);//这个就是输出age的首地址
	
	//1:内存里面的每个字节都有地址
	//2:变量的地址是第一个字节的地址(首地址),地址表明了变量在内存中的位置,地址就是指针
	//c语言里面只要是说到指针就是指的地址
	//3:地址,指针是常量 ,指针变量 = (指针变量)
	//4: 指针是有类型的,就是指针类型,JAVA中的地址叫做引用,类型叫做引用类型
	return 0;
}


2:我们将变量的第一个字节的地址称为变量的指针

 

要去人指针和指针变量:
指针是一个地址。指针变量是保存某一个地址的变量,首先它是一个变量,只不过是保存的地址的。


3:&取地址运算符,取变量的地址

 

 

* 间接访问运算符,存取指定位置的值

 

变量声明的时候标识该变量是指针,使用指针变量的时候前面加上这个*,标识取该位置的值

<span style="white-space:pre">	</span>int a = 100;
<span style="white-space:pre">	</span>int *p=&a;
<span style="white-space:pre">	</span>//*p就是a的别名
<span style="white-space:pre">	</span>//对*p的改变就是对a的改变

	//&,*
	//& 取地址运算符
	int ii=100;
	printf("%p\n",&ii);//&i 三个金元宝在哪里啊?地址
	int *pp =ⅈ
	printf("%p\n",pp);//这里是%p
	printf("%d\n",*pp);//*p三个金元宝,注意这里是%d
	
	*pp=80;
	printf("%d\n",ii);
	
	ii=200;
	printf("%d\n",*pp);

 

 


4:未指向任何变量的指针,称为“悬空指针”其实就是未初始化的指针

 

 

 

//指针的初始化
	int *ip;//悬空地址,0x0
	printf("%p",ip);
	
	int b = 100;
	int *pb = &b;//初始化
	//指针变量pb
	//pb 指向了b
	//*pb 等价于b
	//*pb != pb
	
	int *p1;
	int j = 200;
	p1=&j;//赋值

 

 

5:指针的赋值

 

 

 

//指针赋值:简单的来说就是地址的拷贝
	int q = 100;
	int *pq = &q;
	printf("pg=%p\n",pq);
	int *pqp = pq;
	printf("pqp=%p",pqp);
	
	*pq = 200;
	printf("q=%d\n",q);
	printf("pq=%d\n",*pq);
	printf("pqp=%d\n",*pqp);

 

 

 

6:指针作为函数的参数

 

 

 


	// 指针作为函数的参数,在c语言里面默认的就是使用拷贝的形式来做的,如果想要真的切换两个变量的值,使用swapAddress
	int aa = 1,bb = 2;
	swap(aa,bb);
	printf("aa=%d,bb=%d",aa,bb);
	
	swapAddress(&aa,&bb);
	printf("aa=%d,bb=%d",aa,bb);
//交换两个值
void swap(int a, int b){
	int temp =a;
	a = b;
	b=temp;
}


void swapAddress(int *a,int *b){
	int temp =*a;
	*a = *b;
	*b=temp;
}



有的时候不想你改变我的参数,使用constant ,类似java 里面的final

 

void test(int *p){
	*p =1000;
}

void testConst(const int *p){
	//如果编译的时候下面的会报错	assignment of read-only location '*p'
	//*p =1000;
}
//有的时候不想改变呢?将参数设置为const 类似java 里面的final,
	int testp = 100;
	test(&testp);
	printf("i=%d\n",testp);
	
	testConst(&testp);
	printf("i=%d\n",testp);



指针还可以作为返回值:

 

//指针还可以作为返回值:
	int cc=100,dd=200;
	int *ee = max(&cc,&dd);
	printf("最大值为%d",*ee);




int *max(int *a,int *b){
	if(*a>*b){
		return a;
	}else{
		return b;
	}
}




++++++++++++++++++++++++++++++++++++++++++++++

 

 

 

 

 

#include <stdio.h>

//交换两个值
void swap(int a, int b){
	int temp =a;
	a = b;
	b=temp;
}

void swapAddress(int *a,int *b){
	int temp =*a;
	*a = *b;
	*b=temp;
}

void test(int *p){
	*p =1000;
}

int *max(int *a,int *b){
	if(*a>*b){
		return a;
	}else{
		return b;
	}
}

void testConst(const int *p){
	//如果编译的时候下面的会报错	assignment of read-only location '*p'
	//*p =1000;
}
int main(int argc,const char *argv[]){
	
	int age = 20;
	printf("size=%lu\n",sizeof(age));
	printf("%p\n",&age);//这个就是输出age的首地址
	
	//1:内存里面的每个字节都有地址
	//2:变量的地址是第一个字节的地址(首地址),地址表明了变量在内存中的位置,地址就是指针
	//c语言里面只要是说到指针就是指的地址
	//3:地址,指针是常量 ,指针变量 = (指针变量)
	//4: 指针是有类型的,就是指针类型,JAVA中的地址叫做引用,类型叫做引用类型
	
	//指针变量的声明和指向
	//* 表示,后面的变量是指针变量
	int i =100;
	int *p;//p是int 类型的指针,指针指向的变量的类型,指针保存的额变量地址的类型
	p =&i;//这句话,也叫做p 指向了i
	printf("int类型指针+%p\n",p);
	
	
	//&,*
	//& 取地址运算符
	int ii=100;
	printf("%p\n",&ii);//&i 三个金元宝在哪里啊?地址
	int *pp =ⅈ
	printf("%p\n",pp);//这里是%p
	printf("%d\n",*pp);//*p三个金元宝,注意这里是%d
	
	*pp=80;
	printf("%d\n",ii);
	
	ii=200;
	printf("%d\n",*pp);
	
	//指针的初始化
	int *ip;//悬空地址
	printf("%p",ip);
	
	int b = 100;
	int *pb = &b;//初始化
	//指针变量pb
	//pb 指向了b
	//*pb 等价于b
	//*pb != pb
	
	int *p1;
	int j = 200;
	p1=&j;//赋值
	
	
	//指针赋值:简单的来说就是地址的拷贝
	int q = 100;
	int *pq = &q;
	printf("pg=%p\n",pq);
	int *pqp = pq;
	printf("pqp=%p",pqp);
	
	*pq = 200;
	printf("q=%d\n",q);
	printf("pq=%d\n",*pq);
	printf("pqp=%d\n",*pqp);
	
	// 指针作为函数的参数,在c语言里面默认的就是使用拷贝的形式来做的,如果想要真的切换两个变量的值,使用swapAddress
	int aa = 1,bb = 2;
	swap(aa,bb);
	printf("aa=%d,bb=%d\n",aa,bb);
	
	swapAddress(&aa,&bb);
	printf("aa=%d,bb=%d\n",aa,bb);
	
	//有的时候不想改变呢?将参数设置为const 类似java 里面的final,
	int testp = 100;
	test(&testp);
	printf("i=%d\n",testp);
	
	testConst(&testp);
	printf("i=%d\n",testp);
	
	
	
	//指针还可以作为返回值:
	int cc=100,dd=200;
	int *ee = max(&cc,&dd);
	printf("最大值为%d",*ee);
	
	return 0;
}

 

 


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值