C语言入门系列 - C语言指针

C语言入门系列 - C语言指针

第一节 C 语言基础以及基本数据类型
第二节 C 语言运算符
第三节 C 语言控制语句
第四节 C 语言自定义函数
第五节 C 语言修饰变量的关键字
第六节 C 语言构造数据类型–数组
第七节 C 语言字符串
第八节 C 语言指针
第九节 指针与函数、指针函数、函数指针
第十节 数组与指针、二级指针&NULL&void 指针
第十一节 结构体
第十二节 链表
第十三节 共用体union,枚举enum,宏定义#define,条件编译,const与指针
C语言–图书管理项目


指针

  • C语言入门系列 - C语言指针
  • 前言
  • 一、指针是什么?
  • 二、指针、地址、空间
  • 三、使用步骤
    • 1.定义指针
    • 2.指针操作指向对象的空间
    • 3.指针本身空间
    • 4.指针偏移
  • 总结


前言

  在C语言里指针是精髓,很重要。也是后面的学习各类指针的基础。

& 取地址   * 解地址
*(&a) == a   //取a的地址,再把a的地址解开得到a


一、指针是什么?

指针通常来说指针变量(指针类型的变量)。
它用来干什么的?指针用来存储地址编号的。(既存地址)。
地址编号是什么? 内存(4G 内–4G 个字节)里面会按照字节进行自动编号(十六进制)。

二、指针、地址、空间

指针-- 指针变量–用来存储地址编号。原则上申明指针的时候要确定指向对象的数据类型 *指针名; 但是 指针变量 可以用来存储任一地址编号。

地址:内存中某个字节的编号
指针:指针变量,用来存储地址编号,申明指针的时候 需要指明指针指向的对象的数据类型。
空间:地址编号 + 指针指向的对象数据类型个大小的空间。


三、使用步骤

1.定义指针

定义指针变量:指针对象的数据类型 *指针变量的名字;
指针的三要素: 指针指向的对象的类型  指针的类型  指针名

		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;

2.指针操作指向对象的空间

 & 取地址   * 解地址
  *(&a) == a   //取a的地址,再把a的地址解开得到a
C语言入门系列 - C语言指针_第1张图片
代码如下(示例):

	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;

3.指针本身空间

		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 个字节,与它指向的对象的数据类型无关。

4.指针偏移

地址的偏移改变。

C语言入门系列 - C语言指针_第2张图片

结论:指针的偏移量 和 指针指向的数据类型有关。
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 个字节
加法:向高地址偏移。
减法:向低地址偏移。

C语言入门系列 - C语言指针_第3张图片
练习

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

你可能感兴趣的:(C语言,c语言)