指针是C的灵魂,没有学会指针就相当于没有学过C 指针是C的灵魂,没有学会指针就相当于没有学过C 指针是C的灵魂,没有学会指针就相当于没有学过C (重要的事情说3遍,提醒自己,好好学习,思考)

指针的定义:指针就是内存单元的编号(编号>=0)

指针变量是存放内存单元编号的变量(存放地址的变量)

**指针 & 指针变量是不同的 ** e.g:普通变量a的地址是1000H,可以称a的指针是1000H 但是绝对不能说a的指针变量是1000H 指针是一个操作受限的非负整数:比如2个地址相乘是没有意的 故不能做乘法操作,所以说指针是受限的

指针为什么重要? (1).快速的传递数据,减少内存的使用 (2).可以使函数返回一个以上的值 (3).可以直接访问物理硬件 (4).可以方便的处理字符串 (5).是理解面向对象语言中"引用"功能的基础 (6).可以表示一些复杂的数据结构

指针的分类: 1.基本类型指针(重点):int *i//变量名:i int *表示i变量存放的是int类型变量的地址 e.g:

	      int *i;
	      int a = 10;
	 
	      i = a//error:i & a 虽然都是变量 但是i 是指针变量 a是普通变量 类型不同不能赋值
	 
	      i = &a;//True &是取地址符号 &a表示取变量a的地址;把a的地址赋值给指针变量i
	 
	      printf("*i = %d\n",*i)//输出结果:*i = 3 i获取到a的地址后*i 表示指向了a *i = a;

经典的例子加深对指针的理解:互换2个数字(之前使用的是普通变量,现在使用指针&函数)

#include <stdio.h>

void swap(int p,int q)
{
	int t;
		
	t = p;
	p = q;
	q = t;
	
	return;
}//swap 不能完成互换,只是互换了形参的值 主函数中的实参值并未互换 

void swap1(int *p,int *q)
{
	int *t;
	
	t = p;
	p = q;
	q = t;
}//swap1 不能完成 a b的值互换,只是互换指针变量 

void swap2(int *p,int *q)
{
	int t;
	
	t = *p;//*p =a ,*q=b
	*p = *q;
	*q = t;
}//swap2 互换成功 

int main(void)
{
	int a,b;
	a = 5;
	b = 9;
	
	swap(a,b);
	printf("a = %d,b = %d\n",a,b);
	swap1(&a,&b);
	printf("a = %d,b = %d\n",a,b);
	swap2(&a,&b);
	printf("a = %d,b = %d\n",a,b);
	return 0;
}
/*
 输出结果: 
 a = 5,b = 9 
 a = 5,b = 9 
 a = 9,b = 5 
 
 总结:思考:printf 为什么不能放在被调函数中?
 题目的要求是:互换a b的值 而非被调函数的值互换
 
 测试结果:
 1.swap只是被调函数的形参值互换了 主函数中的实盘并没有互换
 2.swap1 只是互换 a b地址的存储位置 并没有互换 a b地址中的值   
 **3.swap2 为什么会成功?原因很简单哦 swap2的功能是把 a b地址中的值互换了
 简单说:a b是被划分出来的2个静态地址 5,9是存放在地址中的值 swap2功能是把
 2个地址中的 5 9互换 一旦地址中的值达到互换即 a b的值完成了互换**
*/