C语言指针--详解

1. 内存四区
 a)代码区       存放代码
 b)全局区       全局的常量(字符串常量  “abc”) 全局变量
 c)栈区         系统自动开辟,系统自动释放。  并不是很大
 d)堆区         动态开辟的内存,手动开辟,手动释放。  大.           
   i. 链表、数据结构、算法、动态结构体
2. 地址:把内存以单个字节为单位,分开。每一个字节编号,这个编号就是地址
 a) 编号时连续的
 b) 唯一的
 c) 取地址运算符:&单目运算符优先级只比 ()[].  这三个低。  结合性右往左
3. 首地址:一段内存空间中第一个存储单元的地址
4. 指针变量:1.  用来存放地址的变量。       2.    内存大小4B(字节)
 a) 地址是一些编号,是一种数据                    
   i. 整数 int a;
  ii. 字符 char c;
 iii. 小数 float b;
  iv. 地址  指针变量
 b) 指针变量的定义
   i. 数据类型 *变量名  
  ii. int *p;   定义一个指针变量p,p存的是地址
 iii. int 表明在p变量存放的地址的内存空间里面保存的数据类型是int
  iv. * 指明p变量是一个指针变量
 c) 指针变量的赋值:
  i. int a = 5;
 ii. p = &a;   // p指向a
 d) 指针变量的引用:
  i. 访问a这个int变量
	1. 使用变量名    printf(a);     访问内存,结果为5
	2. 指针访问       printf(*p);       访问内存,结果为5
	  a) *指针变量      这个 * 是取值运算符。返回某一个地址中的值。单目运算符
		结合性右向左
	  b) int *p; 在定义指针变量的时候,这个 * 只是表明p是一个指针变量
	  c) 非定义时, *p, 取值,取p指向的内存的值
	  
	
5. 野指针:不能明确指向的指针变量     危险
 a) 类似 int a; 不知道a的值是多少,可能随机一个-847372数
 b) int *p;   //p里面保存的地址是不确定的,p指向是不明确的。所以有可能操作到重要数据
 c) 怎么解决野指针:int *p = NULL;
6. 空指针:void*  没有确定内存开辟出来之后,要存什么数据时,就定义空指针     
 a) 明确类型后:将void* 强制转换成其他的数据类型
7. 指针变量的运算:(4)  +         -            ++   --
 a) 指针偏移,去访问地址旁边的一些内存
 b) 指针变量的加减,以指针所指向的类型空间单位进行偏移                   
  i. char *p;   //  p    char    1   p+1      1B
 ii.  int *p1;   //      int     4   p1+1     4B                 
iii.  double *p2;   //   double  8   p2+1     8B
8. 一维数组与指针: int a[5];
 a) 定义一个一维数组,数组名a是这个数组的《首地址》                   
  i. a的类型:int*                 
 ii. a指向a[0],  a[0]是一个int的元素
iii. printf(a, &a);  两个值都是地址,且值一样
 iv. printf((a+1),(&a+1));   相差20个字节
  v. 结论:a这个地址指向a[0]   a[0]是一个int元素  a+14B  
	  a的类型:int*                 
 vi.           &a这个地址指向整个数组   &a+120B 
	       &a的类型: int(*)[5];
 b) 访问数组元素:
  i. 下标法:a[i]
 ii. 指针法:
    1.     

在这里插入图片描述

	2.

在这里插入图片描述

	3.  *p++不用(), 而 *(p+i) 需要 ()
	4. 因为 *++都是单目运算符,结合性从右到左
	5.+ 是双目运算符,优先级比单目运算符低 
	6. 区别: *p++    p会变(p保存的地址)
	         *(p+i)  p不会变(p保存的地址)	
	7.

在这里插入图片描述

9. 二维数组与指针:
 a)

在这里插入图片描述

 b) 

在这里插入图片描述

c)  a是指向a[0]这个一维数组.    a的类型是int(*)[4]
 d)  a+14 * 4 = 16B  即 a:0行   a+1:1行
 e)  a[0]是一维数组的数组名  首地址a[0][0]   a[0]指向a[0][0]
 f)   a[0]的类型是int*         a[0]+1     4B
 g)  总结:
    i.  int a[3][4];  二维数组
   ii.  首地址a        指向一个一维数组       类型:数组指针int(*)[4]
  iii. &a         类型: int(*)[3][4]
  iv.  a[0] 第一个一维数组的数组名  一维数组的首地址 
  	 类型:int*                  
   v.   a[0][0]  数组的第一个元素 类型:int       
h)  取值 m行n列的元素:
   i. 补充知识:
 	1.      指向a[0];
	2.      a+1指向a[1];
	3.      *(a+1)   取值,就是a[1]的首地址
	4.      *(*(a+1)+2)  就是 取值a[1][2]                  
  ii.           有两种方法:1.下标法       2.指针法
	1.     a[m][n];
	2.     *(a[m]+n);
	3.     *(*a(a+m)+n);
10. 三维数组与指针	

在这里插入图片描述

11. 多维数组与指针
  a)

在这里插入图片描述

12. 指针数组        int*[ ]
13. 数组指针        int(*)[ ]
14. 函数指针
15. 指针形参的函数
16. 结构体指针
17. 字符串与指针
18. 指向指针的指针
19. 数据结构(链表、树、栈、队列 全是指针)
20. C语言是面向过程
21. 指针可以让C语言面向对象!

发布了41 篇原创文章 · 获赞 1 · 访问量 462

猜你喜欢

转载自blog.csdn.net/weixin_44773006/article/details/103550122