目录
1. 指针用法的简单介绍
指针也就是内存地址,指针变量是用来存放内存地址的变量。
include<stdio.h>
int main(void)
{
int* p;//p是变量的名字,int * 表示p表示存放的是int类型变量的地址
int i = 3;
p = &i; // ok
//p = i; error 因为类型不一样,p只能存放int类型变量的地址,不能存放int类型变量的值
//p = 55; error 同上
return 0;
}
注 int*p 应这样理解 :p是变量名,p变量的数据类型是int*类型
所谓int *类型,实际就是存放int变量地址的类型
int表示的是一个整数,所以i只能存放整数。
int*表示的是一个整数地址,所以p只能存放整数地址,而整数地址就是整形变量地址
总结
指针就是地址 地址就是指针
地址就是内存单元的编号
指针变量是存放地址的变量
指针和指针变量是两个不同的概念
但是要注意,通常我们叙述时会把指针变量通称为指针,实际上它们含义并不一样
2. 指针的重要性
表示一些复杂的数据结构
快速的传递数据
使函数返回一个以上的值
能直接返回硬件
能方便的处理字符串
是理解面向对象语言中引用的基础
总之 :指针是C语言的灵魂
3. 指针的定义
地址
内存单元的编号
从零开始的非负整数
范围:4G{0--4g-1}
指针
指针就是地址 地址就是指针
地址就是内存单元的编号
指针变量是存放地址的变量
指针和指针变量是两个不同的概念
但是要注意,通常我们叙述时会把指针变量通称为指针,实际上它们含义并不一样
指针的本质就是一个操作受限的非负整数
4. 指针的分类
1. 基本类型指针
2. 指针和数组
3. 指针和函数
4. 指针和结构体
4. 1基本结构指针
#include<stdio.h>
int main(void)
{
int* p;//p是变量的名字,int * 表示p表示存放的是int类型变量的地址
int i = 3;
int j;
p = &i;
/*
p保存了i的地址,因此p指向i
p不是i,i也不是p,更准确的说;修改p的值不影响i的值,修改i的值也不会影响p的值
如果一个指针变量指向了某个普通变量,则
*指针变量 就完全等同于 普通变量
例子:
如果p是个指针变量,并且p存放了普通变量i的地址
则p指向了普通变量i
*p 就完全等同于 i
或者说: 在所有出现*p的地方都可以替换成i
在所有出现i的地方都可以替换成*p
*p 就是以p的内容为地址的变量
*/
j = *p; //等价于于 j = i;
printf("i = %d, j = %d", i, j);
return 0;
}//i = 3, j = 3
5. 指针常见问题
# include<stdio.h>
int main(void)
{
int i = 5;
int * p;
int* q;
p = &i;
//*q = p; //error 语法编译会出错
//*q = *p; //error
p = q; //q是垃圾值,q赋给p,p也变成垃圾值
printf("%d\n", *q);
/*
q的空间是是属于本程序,所以本程序可以读写q的内容,
但是如果q内部是垃圾值,则本程序不能读写* p的内容
因为此时*q所代表的内存单元的控制权限并没有分配给本程序
所以本程序运行到13行时就会立即出错
*/
return 0;
}
6. 经典指针程序 互换两个数
#include<stdio.h>
//并不能完成互换功能
void huhuan(int a, int b)
{
int t;
t = a;
a = b;
b = t;
return;
}
int main(void)
{
int a = 3;
int b = 5;
huhuan(a, b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
不行
#include<stdio.h>
//不能完成互换
void huhuan(int *p, int *q)
{
int * t; //如果要互换p和q的值,则t必须是int *,不能是int,否则会出错
t = p;
p = q;
q = t;
}
int main(void)
{
int a = 3;
int b = 5;
huhuan(&a, &b); //huhuan(*p, *q);是错误的 huhuan(a, b); 也错误
printf("a = %d, b = %d\n", a, b);
return 0;
}
也不行
#include<stdio.h>
//完成
void huhuan(int* p, int* q)
{
int t; //如果要互换*p和*q的值,则t必须定义为int,不能定义成int *,否则语法出错
t = *p;//p是int *,* p是int
*p = *q;
*q = t;
}
int main(void)
{
int a = 3;
int b = 5;
huhuan(&a, &b); //huhuan(*p, *q);是错误的 huhuan(a, b); 也错误
printf("a = %d, b = %d\n", a, b);
return 0;
}
成功
感谢大家的观看