int * p ;
int i = 3 ;
// p 是一个 指针变量 i 是一个普通变量
// int * 是一个整体 ;p 是一个整体表示一个指针变量; 表示 p 只能存放 int 类型的 变量 的地址值
// i 是一个 int 类型的 变量 p 表示 int 型变量的地址值
//所以可以 & 是取地址的意思
p = & i;
/*
1.把 i 的地址 赋值给 p p指向了i
2.p不是i i也不是p 修改p 不会影响i 修改i也不影响p
3. 如果一个 指针变量 指向了某个 普通变量
则 * 指针变量 完全等价于 普通变量
{
例如:p 是一个指针变量 存放了 i (普通变量)的地址
则 p 指向了 i
*p 完全等同于 i
也就可以说 只要是出现了 i 的地方 都可以替换成 *p
出现了 *p 的地方都可以替换成 i
}
*/
int * p ;
int i = 3;
*p = i ;
//报错 因为把 i 赋值给一个未知单元 系统报错
利用指针 交换两个变量的值
#include<stdio.h>
void swap(int *p,int *q);
int main(void)
{
int a =1,b = 3;
swap(&a,&b); //把a的地址取出来 b 的地址也取出来
printf("a = %d ; b = %d\n",a,b);
return 0;
}
void swap(int *p,int *q){
// a 和 b 的地址是死的 分配内存的时候就已经确定 不能修改
// 可以修改 a 和 b 的值;但是 不能直接修改 不然修改的是形参 实参不会改变
// 可以使用 指针(*p 等价与 a) 改变*p 和 *q 的值 就改变了实参 对应的值
int t;
t = *p;
*p = *q;
*q = t;
return;
}
C语言 自定义函数 需要现在 最上边声明 一下函数名 (可以没有参数 只有类型)并使用分号结尾
例如
void swap(int * , int *);
结构体
定义:
struct Student{
int id;
char sex;
float score;
};初始化:
struct Student s1 = { 1 , 'F' , 8.9};
s1.id = 2; s1.sex = 'F';
atruct Student * stu = &s1; stu->age 等价于 (*stu).age 等价于 s1.age;
链表
头指针是最重要的 知道了头节点 就能控制一个链表 pHead
pNext 表示下一个节点地址
pHead—>pNext 表示头节点 中存放的下一个节点 如果为空 就为空链表
pHead—>pNext 等价于 (*pHead).pNext
链表:优点:插入 删除某个元素效率高
缺点:查找某个元素的效率低(无序 无下标)
数组:优点:存取速度快 方便查找(有序)
缺点:插入 删除一个元素 效率低(因为后边的所有元素都需要移动一下)