手把手入门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");
}