手把手入门C语言—C语言指针

指针前言

什么是指针?

1、指针用于存放地址

2、打印值*p

3、加深理解指针实验*p=123
 

指针的长度

指针的长度:打印各种指针的长度,所有指针的长度为4个字节

#include <stdio.h> 
#include <stdlib.h>

/**
  指针的长度 是4个字节(能够传任何类型的地址) 
*/
main(){
	
	int* iPoint;
	char* cPoint;
	
	printf("iPoint的长度=%d\n",sizeof(iPoint));
	printf("cPoint的长度=%d\n",sizeof(cPoint));
	
	system("pause");
} 

指针的深入理解

四个小实验 int i = 123;int* p; p = &i;
理解指针
1、指针和指针变量的关系

  指针就是地址,地址就是指针

  地址就是内存单元的编号

  指针变量是存放地址的变量

  指针和指针变量是两个不同的概念

  但是要注意: 通常我们叙述时会把指针变量简称为指针,实际它们含义并不一样

  指针里存的是100, 指针: 地址–具体

  指针里存的是地址, 指针: 指针变量 – 可变
 

2、为什么要使用指针

  指针的重要性

  直接访问硬件 (opengl 显卡绘图)

  快速传递数据(指针表示地址)

  返回一个以上的值(返回一个数组或者结构体的指针)

  表示复杂的数据结构(结构体)

  方便处理字符串

  指针有助于理解面向对象
 

3、*号的三种含义

  *号的含义

  数学运算符: 3 * 5

  定义指针变量: int* p;

  指针运算符(取值): *p (取p的内容(地址)在内存中的值)
 

指针初步练习

指针取值*p :把p变量对应的地址的值取出来
如图:
内存地址为16进制:1000H、2000H
在这里插入图片描述
代码示例:

#include <stdio.h>
#include <stdlib.h>

/**
  指针就是内存地址 
  内存地址就是指针
*/
main(){
	
	// 定义一个int类型的变量 i ,并且赋值为 10;
	int i = 10;
	
	// 指针其实就是某种类型,在右上方有一个加号 
	// 定义一个int类型的一级指针变量 p
	int* p;
	// 把i对应的地址赋值给p变量 
	p = &i; 
	
	// 指针取值*p :把p变量对应的地址的值取出来 
	printf("*p=%d\n",*p); 
	
	system("pause");
}

指针的赋值练习

添加如下代码:*p = 100; // 赋值

#include <stdio.h>
#include <stdlib.h>

/**
  指针就是内存地址 
  内存地址就是指针
*/
main(){
	
	// 定义一个int类型的变量 i ,并且赋值为 10;
	int i = 10;
	
	// 指针其实就是某种类型,在右上方有一个加号 
	// 定义一个int类型的一级指针变量 p
	int* p;
	// 把i对应的地址赋值给p变量 
	p = &i; 
	
	// 指针取值*p :把p变量对应的地址的值取出来 
	printf("*p=%d\n",*p); 
	// 给指针 p 赋值,打印为 100 
	*p = 100; // 赋值 
	printf("*p=%d\n",*p); 
	
	system("pause");
}

如图可理解为:
在这里插入图片描述
当通过知道内存地址的值之后修改它的值时会直接跳出循环

#include <stdio.h>
#include <stdlib.h>

/**
  指针就是内存地址 
  内存地址就是指针
*/
main(){
	
	printf("玩游戏倒计时开始了:\n"); 
	
	int i;
	
	for(i=100;i>0;i--){
		// 这里有一些不同 ,可以尝试 _sleep 或者 sleep 或者 Sleep
		_sleep(5000);
		printf("还剩下多少秒:%d\n",i); 
	}
	// 当通过知道内存地址的值之后修改它的值时会直接跳出循环 
	printf("恭喜您,完成了游戏!\n"); 
	
	system("pause");
}

在这里插入图片描述

加深指针的理解

实验一

第一个实验: 如果修改 i 值, p值有变化吗?
当我们在次打印p的值时,虽然i的值变为200了,但是是打印p的值,打印p的值与i的值(100,200),没有关系。

#include <stdio.h>
#include <stdlib.h>

/**
  指针就是内存地址 
  内存地址就是指针
*/
main(){
	
	int i =100;
	int* p = &i;	
	
	// 第一个实验: 如果修改 i 值, p值有变化吗? 
	// 修改i值前,p的值时:0x60fef8
	// 修改i值后,p的值时:0x60fef8
	// 得出的结果为不变 
	// 当我们在次打印p的值时,虽然i的值变为200了,但是是打印p的值,打印p的值与i的值(100,200),没有关系。
	printf("修改i值前,p的值时:%#x\n",p); 
	i =200;
	printf("修改i值后,p的值时:%#x\n",p); 
}

如图分析:
在这里插入图片描述
在这里插入图片描述

实验二

第二个实验: 如果修改 p 值, i值有变化吗?
当执行完p = &j;时p的地址值变了,但是i的值没有变化

#include <stdio.h>
#include <stdlib.h>

/**
  指针就是内存地址 
  内存地址就是指针
*/
main(){
	
	int i =100;
	int* p = &i;	
	//第二个实验: 如果修改 p 值, i值有变化吗? 
	// 修改 p 的话是修改地址值,所以定义 int j = 200;
	// 结果如下:
	// 修改p值前,i的值时:100
	// 修改p值后,i的值时:100 
	printf("修改p值前,i的值时:%d\n",i); 
	int j = 200;
	p = &j;
	printf("修改p值后,i的值时:%d\n",i); 
	system("pause");
}

如图分析:在这里插入图片描述
在这里插入图片描述

实验三

第三个实验: 如果修改 i 值, *p值有变化吗?
有变化,*p:把对应的地址的值取出来,此时为200

#include <stdio.h>
#include <stdlib.h>

/**
  指针就是内存地址 
  内存地址就是指针
*/
main(){
	
	int i =100;
	int* p = &i;	
	
	//第三个实验: 如果修改 i 值, *p值有变化吗?
	// *p对应的是int类型的占位符 
	printf("修改i值前,*p的值时:%d\n",*p); 
	i =200;
	// *p:把对应的地址的值取出来,此时为200
	printf("修改i值后,*p的值时:%d\n",*p); 
	 
	system("pause");
}

如图分析:
在这里插入图片描述
在这里插入图片描述

实验四

==第四个实验: 如果修改 *p 值, i值有变化吗? ==
有变化,*p = 200; 执行完后:把对应的地址的值变为200

#include <stdio.h>
#include <stdlib.h>

/**
  指针就是内存地址 
  内存地址就是指针
*/
main(){
	
	int i =100;
	int* p = &i;	
	
	//第四个实验: 如果修改 *p 值, i值有变化吗? 
	printf("修改*p值前,i的值时:%d\n",i); 
	// 把地址对应的值改变了 
	*p = 200;
	printf("修改*p值后,i的值时:%d\n",i); 
	
	
	system("pause");
}

如图分析:在这里插入图片描述
在这里插入图片描述

总代码

#include <stdio.h>
#include <stdlib.h>

/**
  指针就是内存地址 
  内存地址就是指针
*/
main(){
	
	int i =100;
	int* p = &i;	
	
	//第一个实验: 如果修改 i 值, p值有变化吗? 
	// 修改i值前,p的值时:0x60fef8
	// 修改i值后,p的值时:0x60fef8
	// 得出的结果为不变 
	// 当我们在次打印p的值时,虽然i的值变为200了,但是是打印p的值,打印p的值与i的值(100,200),没有关系。
	/**
	printf("修改i值前,p的值时:%#x\n",p); 
	i =200;
	printf("修改i值后,p的值时:%#x\n",p); 
	
	
	//第二个实验: 如果修改 p 值, i值有变化吗? 
	// 修改 p 的话是修改地址值,所以定义 int j = 200;
	// 结果如下:
	// 修改p值前,i的值时:100
	// 修改p值后,i的值时:100 
	/**
	printf("修改p值前,i的值时:%d\n",i); 
	int j = 200;
	p = &j;
	printf("修改p值后,i的值时:%d\n",i); 
	*/
	
	
	//第三个实验: 如果修改 i 值, *p值有变化吗?
	// *p对应的是int类型的占位符 
	/**
	printf("修改i值前,*p的值时:%d\n",*p); 
	i =200;
	printf("修改i值后,*p的值时:%d\n",*p); 
	*/
	
	
	//第四个实验: 如果修改 *p 值, i值有变化吗? 
	printf("修改*p值前,i的值时:%d\n",i); 
	// 把地址对应的值改变了 
	*p = 200;
	printf("修改*p值后,i的值时:%d\n",i); 
	
	
	system("pause");
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值