指针01

zhi

内存

1.堆

  • 在动态申请内存的时候,在堆开辟内存

2.栈

  • 主要存放局部变量(在函数内部,或复合语句内部定义的变量)

3.静态全局区

  • 未初始化的静态全局区

    • 静态变量(定义的时候,前面加static修饰),或全局变量
  • 初始化的静态全局区

    • 全局变量,静态变量,赋过初值的,存放在此区

4.代码区

  • 存放咱们的程序代码

5.文字常量区

  • 存放常量的

指针变量

指针变量就是用来存放一个地址编号的变量

指针变量的定义

1.简单指针的定义

  • 定义方法

数据类型* 指针变量名;

  • 野指针,没有指向的指针不知道指向哪里

2.关于指针的运算符
&取地址符、*取值

	//定义一个简单的int指针变量 
	int *p;
	//定义一个int型变量并且赋值 
	int d = 12;
	//取d 的地址赋给 p
	p = &d;
	printf("d的地址为:%p,\nd的值为:%d,\np的地址为:%p,\np的值为:%d",&d,d,p,*p);
	/*
	d的地址为:0062fec8,
	d的值为:12,
	p的地址为:0062fec8,
	p的值为:12
	*/

分析:
1 在调用的时候*代表取值的意思,*p就相当于p指向的变量,即d

2 故num=*pnum=d的效果是一样的

3 所以说num的值为12,地址为0062fec8

3.指针的大小

	//测试指针的大小
	int* intp;
	long* longp;
	short* shortp;
	float* floatp;
	double* doublep;
	char* charp; 
	printf("int指针大小:%d\n",sizeof(intp)); 	
	printf("long指针大小:%d\n",sizeof(longp));
	printf("short指针大小:%d\n",sizeof(shortp));
	printf("floatt指针大小:%d\n",sizeof(floatp));
	printf("double指针大小:%d\n",sizeof(doublep));
	printf("char指针大小:%d\n",sizeof(charp));
	//都是4说明和存地址的大小一致 
	/*
	int指针大小:4
	long指针大小:4
	short指针大小:4
	floatt指针大小:4
	double指针大小:4
	char指针大小:4
	*/

指针和变量的关系

	//指针和变量的关系
	
 
	//程序中引用变量的方法 
	
	//1.直接通过变量的名称	
		int a;
		a=10;
	
	//2.可以通过指针变量来引用变量
		int *p; 	//在定义的时候,*不是取值,是修饰这个变量是指针变量
		p=&a;		//取a的地址给p赋值,p保存了a的地址,也就是说p指向了a 
		printf("p的地址为%p  \n a的地址是 %p \n &a 的地址是 %p \n&p的地址是 %p\n",p,a,&a,&p);	 
	
		/**
		p的地址为0062fecc   	这是p指针指向的地址 ,就是a的地址 ,说明指针变量里存的是个地址 
		a的地址是 0000000a		这是a的值的地址,10用16进制表示就是 a,说明int类型变量里存的也是个地址,指向它存储的值 
		&a 的地址是 0062fecc	这是内存中变量a的地址,因为用了& 
		&p的地址是 0062fec8		这个内存中指针变量p的地址,因为用了& 
		 **/
		
		*p = 100;  //在调用时*是取值的意思,*地址等价于变量 
		printf("a 的值为 : %d,%d,%d\n",a,*&a,*&*&*&a); //a 的值为 : 100,100,100 ,说明*是取这个地址的值,&是取地址,了解之后可以出现 *&*&*&a 这种奇怪的东西
		
	//3. 指针++的意思 
		printf("p 目前的地址是%p:\n",p); //p 目前的地址是0062fecc:
		p++;
		printf("p++ 后的地址是%p:\n",p); //p++ 后的地址是0062fed0: 0xcc + 0x04 = 0xd0 说明刚好跳了4个字节
		printf("p++:%d",*p); 	//p++:54 不知道是哪个数 
		
		char ch = 'c';
		char *c = &ch;
		printf("c 目前的地址是是%p:\n",c); //c 目前的地址是是0062fec3:
		c++;
		printf("c++ 后的地址是%p:\n",c); //c++ 后的地址是0062fec4: 说明char只会跳1 个字节 ,说明指针++会根据指针的类型来确定跳过多少个地址 

指针和数组的关系

  • 如何用指针代替数组去操作
int main(){
	
	// 指针变量可以指向一个数组,而C语言规定,数组名是个常量指向数组的首地址,数组从0开始 
	int *p;
	int arr[5]; 
	
	//1. 可以用数组名[下标引用] 
	arr[1] = 2;
	
	p = arr;
	// 2. 也能用 指针名[下标引用] 
	p[2] = 5;
	
	
	//3. 可以指针++赋值 
	*(p+3) = 6; 
	
	//4 . 数组名++ 赋值
	*(arr+4) = 66; 
	
	printf("P 为 %p , arr 为 %p\n",p,arr); // P 为 0062feb8 , arr 为 0062feb8 ,说明将数组的首地址给指针了 
	
	printf("arr[1]:%d,arr[2]:%d\n",arr[1],arr[2]); //arr[1]:2,arr[2]:5  ,说明指针和数组调用的都是同一个 
	printf("arr[3]:%d\n",arr[3]);  	//arr[3]:6
	printf("arr[4]:%d\n",arr[4]); 	//arr[4]:66
	return 0; 
}

指针02

posted @ 2022-06-23 13:16  阿肆啊  阅读(17)  评论(0编辑  收藏  举报