手把手入门C语言—C语言指针
手把手入门C语言—C语言指针 指针的长度 指针初步练习指针的赋值练习加深指针的理解 总代码
指针前言 什么是指针?
1、指针用于存放地址
2、打印值*p
3、加深理解指针实验*p=123
指针的长度
指针的长度:打印各种指针的长度,所有指针的长度为4个字节
#include
#include /**指针的长度 是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、为什么要使用指针
指针的重要性
直接访问硬件 ( 显卡绘图)
快速传递数据(指针表示地址)
返回一个以上的值(返回一个数组或者结构体的指针)
表示复杂的数据结构(结构体)
方便处理字符串
指针有助于理解面向对象
3、*号的三种含义
*号的含义
数学运算符: 3 * 5
定义指针变量: int* p;
指针运算符(取值): *p (取p的内容(地址)在内存中的值)
指针初步练习
指针取值*p :把p变量对应的地址的值取出来
如图:
内存地址为16进制:1000H、2000H
代码示例:
#include
#include /**指针就是内存地址 内存地址就是指针
*/
main(){// 定义一个int类型的变量 i ,并且赋值为 10;int i = 10;// 指针其实就是某种类型,在右上方有一个加号 // 定义一个int类型的一级指针变量 pint* p;// 把i对应的地址赋值给p变量 p = &i; // 指针取值*p :把p变量对应的地址的值取出来 printf("*p=%d\n",*p); system("pause");
}
指针的赋值练习
添加如下代码:*p = 100; // 赋值
#include
#include /**指针就是内存地址 内存地址就是指针
*/
main(){// 定义一个int类型的变量 i ,并且赋值为 10;int i = 10;// 指针其实就是某种类型,在右上方有一个加号 // 定义一个int类型的一级指针变量 pint* p;// 把i对应的地址赋值给p变量 p = &i; // 指针取值*p :把p变量对应的地址的值取出来 printf("*p=%d\n",*p); // 给指针 p 赋值,打印为 100 *p = 100; // 赋值 printf("*p=%d\n",*p); system("pause");
}
如图可理解为:
当通过知道内存地址的值之后修改它的值时会直接跳出循环
#include
#include /**指针就是内存地址 内存地址就是指针
*/
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
#include /**指针就是内存地址 内存地址就是指针
*/
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
#include /**指针就是内存地址 内存地址就是指针
*/
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
#include /**指针就是内存地址 内存地址就是指针
*/
main(){int i =100;int* p = &i; //第三个实验: 如果修改 i 值, *p值有变化吗?// *p对应的是int类型的占位符 printf("修改i值前,*p的值时:%d\n",*p); i =200;// *p:把对应的地址的值取出来,此时为200printf("修改i值后,*p的值时:%d\n",*p); system("pause");
}
如图分析:
实验四
==第四个实验: 如果修改 *p 值, i值有变化吗? ==
有变化,*p = 200; 执行完后:把对应的地址的值变为200
#include
#include /**指针就是内存地址 内存地址就是指针
*/
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
#include /**指针就是内存地址 内存地址就是指针
*/
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");
}