第一节 C 语言基础以及基本数据类型
第二节 C 语言运算符
第三节 C 语言控制语句
第四节 C 语言自定义函数
第五节 C 语言修饰变量的关键字
第六节 C 语言构造数据类型–数组
第七节 C 语言字符串
第八节 C 语言指针
第九节 指针与函数、指针函数、函数指针
第十节 数组与指针、二级指针&NULL&void 指针
第十一节 结构体
第十二节 链表
第十三节 共用体union,枚举enum,宏定义#define,条件编译,const与指针
C语言–图书管理项目
在C语言里指针是精髓,很重要。也是后面的学习各类指针的基础。
& 取地址 * 解地址
*(&a) == a //取a的地址,再把a的地址解开得到a
指针通常来说指针变量(指针类型的变量)。
它用来干什么的?指针用来存储地址编号的。(既存地址)。
地址编号是什么? 内存(4G 内–4G 个字节)里面会按照字节进行自动编号(十六进制)。
指针-- 指针变量–用来存储地址编号。原则上申明指针的时候要确定指向对象的数据类型 *指针名; 但是 指针变量 可以用来存储任一地址编号。
地址:内存中某个字节的编号
指针:指针变量,用来存储地址编号,申明指针的时候 需要指明指针指向的对象的数据类型。
空间:地址编号 + 指针指向的对象数据类型个大小的空间。
定义指针变量:指针对象的数据类型 *指针变量的名字;
指针的三要素: 指针指向的对象的类型 指针的类型 指针名
int *p;
指针指向的对象的类型:int (除了*和指针名剩下的部分就是指向的对象的类型)
指针的类型:int * (除了指针名剩下对的部分就是它的类型)
指针名:p
int (*p)[20];
指针指向的对象的类型:int [20]
指针的类型:int (*)[20]
指针名:p
int a = 10;
printf("%p",&a); //000000000062FE14
//用一个指针去保存a的地址,那么就叫做指针的指向对象是a.a是什么类型?int 类型 。这个指针指向的对象的类型 int
int *p; //定义一个指针变量 -- 开空间
p = &a; //赋值
printf("%p\n",p); //000000000062FE14
char ch = 'a';
//声明一个指针变量指向 ch; 指向谁就是保存谁的地址。(分析指针指向谁的时候一定要转换成&+空间名的形式)
//ch 是什么类型 -- char
char *q = &ch; //等价于 char *q; q = &ch;
int a = 10;
int *p = &a; //等价于 int *p; p = &a;
//指针变量空间名字是 p;
//指针指向的对象的空间名字: *p 即 a; *p=*(&a)=a
printf("%d\n",a+8); //打印 18
printf("%d\n",*p+8);//打印 18
}
指针在使用的时候必须有明确的指向。必须给他赋值。
以下是错误的写法:
int *q;
*q + 5;
int a = 10;
int *p = &a;
指针本身的空间就是 p;读写操作。
int b = 20;
p = &b;
printf("%d",*p); //20
指针空间到底是多大? 指针变量的空间是多大? sizeof(数据类型 / 变量名)
int *p;
sizeof( p ) 或 sizeof(int *) // 4/8
根据编译器位数不同 32位就是4个字节,64位就是8个字节
// 指针是用来保存地址值的, 1个字节一个编号,内存里面是按照字节编号的
char *q;
sizeof(q) 或者 sizeof(char *) // 4/8
因为:指针变量是用来存储地址编号的。与它指向的对象的数据类型无关。
指针变量空间跟编译器的处理位数有关,32 位就是 4 个字节,64 位就是 8 个字节,与它指向的对象的数据类型无关。
地址的偏移改变。
结论:指针的偏移量 和 指针指向的数据类型有关。
p+1 p 指向的对象类型是 int 类型,所以偏移 1 就代表偏移 1 个 int 数据,偏移 4 个字节
q +1 q 指向的对象类型是 char 类型,所以偏移 1 就代表偏移 1 个 char,偏移 1 个字节
int (*p)[20] p + 1 p 指向的对象的类型是 int[20],所偏移 1就代表偏移 1 个 int [20]数据,偏移 80 个字节
加法:向高地址偏移。
减法:向低地址偏移。
int main()
{
unsigned char a,b,c,d,e,f,g,h,x,y,z;
unsigned char arr[6] ={3,6,10,21,40,50};
unsigned char *sp;
sp = &arr[0];
a=*sp; //3
b=*sp+1; //4
c=*sp++; //3 先算++:sp=sp+1;但因为++在后,所以原sp作为表达式的值,*sp=arr[0]
d=*sp; //6 *sp==arr[1];
e=*(sp+1); //10 *(sp=1)==arr[2];但sp没有发生改变
f=*sp; //6 *sp==arr[1];
x=sizeof(arr[0]); //1
y=sizeof(sp); //4 / 8
printf("%d %d %d %d %d %d %d %d",a,b,c,d,e,f,x,y);
return 0;
}
指针 – 指针变量 – 存储地址编号的(某个变量的首地址 &变量名)
定义指针变量:指针对象的数据类型 *指针变量的名字;
指针的三要素: 指针指向的对象的类型 指针的类型 指针名
int *p;
指针指向的对象的类型:int (除了*和指针名剩下的部分就是指向的对象的类型)
指针的类型:int * (除了指针名剩下对的部分就是它的类型)
指针名:p
int (*p)[20];
指针指向的对象的类型:int [20]
指针的类型:int (*)[20]
指针名:p
指针操作它指向的空间 *+指针名 == *p;
指针本身空间里面存储的是 指向空间的地址
int *p ;
p = &a;
//改变指针的指向。
int b = 20;
p = &b; // *p === b
& 取地址 * 解地址
*(&a) == a //取a的地址,再把a的地址解开得到a
int *p;
p=&a;
p才是指针变量,用于存储地址。 p的类型int *
*p代表的是指针指向的空间----a *p的类型是int