C语言中指针是最灵活,也最难掌握的东西,以前不知道指针究竟是什么,后来学习汇编后,慢慢理解了指针。
学习指针主要解决三个问题
- 指针是什么
- 指针有什么用
- 指针怎么用
先说几个概念,首先要明白,cpu在处理数据的也要解决三个问题,数据在哪里,对数据进行怎样的操作(读或写),怎么传数据。所以在计算机里面cpu和内存之间有三种线来解决这三个问题
地址总线 :找到cpu所想操作内存单元在那里
控制总线 :对cpu数据进行操作
数据总线 :传输数据
内存除了存储整形,浮点型数据之外,内存还可以存地址。那么我们就可以知道指针是什么了,指针就是存放地址值的变量,也就是说指针也是需要占用内存的。
那使用指针有什么用?
1.数据结构实现就需要指针来实现
例如定义链表LinkList这种数据结构,数据结构关注三个方面
逻辑结构
存储结构
运算
LinkList中Link表示其存储结构,使用链式实现,List表示逻辑结构,线性,一对一的关系。既要Link也要List,那么C语言怎么表示,链表有结点构成,C语言定义节点NODE
typedef struct node
{
datatype data;
struct node *next;
} LNode;
2.指针可以让程序操作内存,灵活使用,使程序简洁,高效
指针怎么用
指针的操作
- 赋值
- 取值
- 取指针地址
- 与整数加减
- 比较
写一个程序来认识指针
#include
int main(void){
int a;//变量名是变量a的地址
int b;
int * p; //指针是变量,其数值是地址 为什么要指定int类型的指针
a=100; //赋值,本质,根据a这个变量名寻址,然后把数值100,写入到已分配的内存单元
p=&a; // 指针赋值,&为取地址运算符,把a的值赋给p, p就指向了a所指向的内存单元 , * 为取值符号
printf("%p\n",main); //函数名本质也是地址
printf("%d\n",a);
printf("%p\n",&a);
printf("%p\n",&b);
printf("%p\n",p); //p变量名 的就是 p的地址
printf("%p\n",&p);
printf("%p\n",p+1); //整数加给指针:整数都会指针所指类型的字节数相乘,然后结果加到指针的值上,减类似
printf("%d\n",*p); //输出p指针所指的内存单元数据到屏幕 *p ,* 为取值符号
printf("%d\n",sizeof(p));
printf("%d\n",sizeof(a));
return 0;
}
屏幕输出