1. 指针的重要性:
总结:指针是c语言的灵魂
2. 指针的定义
(1)地址
内存单元的编号
从零开始的非负整数
范围:4G(0-4G-1)

控制线:控制数据传输的方向
数据线:进行数据传输
地址线:用来确定对内存条的哪个单元进行控制(有32个地址总线,一个地址线能控制2个内存单元,32个地址线能控制2^32个内存单元)
(2)指针
(3)指针的分类
1. 基本类型指针
int * p;//p是变量的名字,(int *)表示p变量存放的是int类型变量的地址
//int * p;不表示定义了一个名字叫做*p的变量
// 所谓int * 类型实际就是存放int变量地址的类型
int i = 3;
p = &i; // p保存了i的地址,因此p指向i
*p= i ; //*p就是i
指针常见错误
常见错误一:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int * p; //p是局部变量,若不初始化,则为垃圾值
int i = 5;
*p = i;//错误,p应该先指向一个地址,p变量里面是一个垃圾值,不知道*p里面的内容,但是把i=5修改了一个不属于你的单元
printf("%d\n", *p);
return 0;
}
常见错误二:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 5;
int * p;
int * q;
p = &i;
//*q = p; //错误,int 不能向int * 转换
//*q = *p; //error,因为q没有赋值,q是一个垃圾值,*q是一个不属于你能控制的单元
p = q; //q是垃圾值,q赋给p,p也变成垃圾值
printf("%d\n",*q);
/*
q的空间是属于本程序的,所以本程序可以读写q的内容
但是如果q内部是垃圾值,则本程序不能读写*q的内容
因为*q所代表的内存单元的控制权限并没有分配给本程序
所以本程序运行到14行就会立即出错
*/
return 0;
}
互换两个数字
#include <stdio.h>
#include <stdlib.h>
void exchange_1(int ,int );
void exchange_2(int * ,int *);
void exchange_3(int * ,int *);
int main()
{
int a = 3;
int b = 5;
exchange_3(&a,&b); //exchange_2(*p,*q); 是错误的,exchange_2(a,b);是错误的
printf("a = %d, b = %d\n",a,b);
}
//不能完成互换功能
void exchange(int a, int b)
{
int t;
t = a;
a = b;
b = t;
return ;
}
// 不能完成互换功能
void exchange_2(int * p,int * q)// 形参名字是p,q接收实参数据的是p和q
{
int * t; //如果要互换p和q的值,则t必须是 int *类型,不能是int类型,否则会出错
t = p;
p = q;
q = t;
}
//可以完成互换的功能
void exchange_3(int * p,int * q)
{
int t; //如果要互换*p和*q的值,则t必须定义成int,不能定义int *,否则会出错
t = *p; //p是 int *, *p 是int(*p代表以p地址为整型的变量)
*p = *q;
*q = t;
}
附注:
*的含义
1. 乘法
2. 定义指针变量
int * p; //定义了一个名叫p的变量, int *表示p只能存放int变量的地址
3. 指针运算符
该运算符放在已经定义好的指针变量的前面
如果p是已经定义好的指针变量,则 *p表示 以p的内容为地址的变量
例:int * p; //定义一个p的指针变量
*p = 5;
如何通过被调函数修改主调函数普通变量的值
1. 实参必须为该普通变量的地址
2. 形参必须为指针变量
3. 在被调函数中通过
* 形参名 = .......
的方式就可以修改主调函数相关变量的值
#include <stdio.h>
#include <stdlib.h>
void exchange_3(int * ,int * );
void exchange_3(int * p,int * q)
{
int t;
t = *p;
*p = *q;
*q = t;
return ;
}
int main()
{
int a = 3;
int b = 5;
exchange_3(&a,&b);
printf("a = %d, b = %d",a,b);
return 0;
}
原文:https://www.cnblogs.com/spore/p/11030164.html