数组与指针、二级指针&NULL&void指针-创新互联

C语言入门系列 - 数组与指针、二级指针&NULL&void 指针

第一节 C 语言基础以及基本数据类型
第二节 C 语言运算符
第三节 C 语言控制语句
第四节 C 语言自定义函数
第五节 C 语言修饰变量的关键字
第六节 C 语言构造数据类型–数组
第七节 C 语言字符串
第八节 C 语言指针
第九节 指针与函数、指针函数、函数指针
第十节 数组与指针、二级指针&NULL&void 指针

创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于网站设计、网站制作、舟曲网络推广、微信小程序开发、舟曲网络营销、舟曲企业策划、舟曲品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们大的嘉奖;创新互联公司为所有大学生创业者提供舟曲建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com
文章目录
  • C语言入门系列 - 数组与指针、二级指针&NULL&void 指针
    • @[TOC](文章目录)
  • 一、指针指向数组中的元素
  • 二、数组指针
    • 1.数组指针定义
    • 2.数组指针对数组元素进行读写操作
  • 三、指针数组
  • 四、二级指针
  • 五、NULL指针
  • 六、void指针
  • 总结

一、指针指向数组中的元素

int a[3] = {1,2,3};
   使用一个指针指向数组中的元素 – int 类型
   指针指向的对象是 int 类型
printf(“%p %p”,a,&a[0]); 0x0062FE90 0x0062FE90
int *p = &a[0];       // int *p = a; 一样的意思
int *p = 0x0060FE90;  // int *p = 0x0062FE90;
分析指针指向对象的时候,将赋值符号后面的内容转换成 & + x 的形式,x 就是指针的指向对象,分析 x 是什么类型。

原理:指针指向谁就保存谁的地址,保存谁的地址就指向谁。

二、数组指针

int a[3];
元素的类型:int
数组名:a
数组的类型:int [3]

1.数组指针定义

首先这是一个指针,指向的对象是数组,指向对象的类型是数组类型 .
定义一个指针指向 a;
int ( * p)[3]; ---- 数组指针
指针名:p
指针类型:int (*)[3];
指向对象的类型:int [3]
p = &a

#includeint main()
{int a[3];
	// 申明指针指向 a,保存&a
	// a 的类型是数组,所以声明指针的时候声明数组指针
	int (*p)[3];
	// 需要个指针明确的指向
	p = &a;
	// *p == a -- a 是数组的名字 == 数组首元素的地址 &a[0]
	// &a[0] 				&a[1] == &a[0]+1 	&a[2] == &a[0]+2
	// *p 					*p+1 				*p+2
	
	// a[0] == *(&a[0]) 	a[1] 				a[2]
	// *(*p) 				*(*p+1) 			*(*p+2) 
	*(*p) = 10; 
	*(*p+1) = 20; 
	*(*p+2) = 30;
	printf("%d %d %d\n",*(*p),*(*p+1),*(*p+2));//10 20 30
	printf("%d %d %d",a[0],a[1],a[2]);		  //10 20 30
	return 0;
}

int a;
int * p;
p = &a;
  * p ==  p 指针指向的空间 a
& – 取地址  * 解地址
 *p == *(&a) == a

int (* p)[3];
指针名:p
指针的类型:int (*)[3]
指针指向的对象的类型:int [3]
指针偏移一个怎么表达?偏移一个偏移多少?
p+1 偏移字节数 == 指针指向的对象的类型 int [3]

2.数组指针对数组元素进行读写操作
*(*p) = 10;
*(*p+1) = 20;
*(*p+2) = 30;
printf("%d %d %d",*(*p) ,*(*p+1),*(*p+2)); // 10 20 3
// 循环
	int i;
	for(i=0;i<3;i++)
	{scanf("%d",*p+i);
	}
	printf("%d %d %d",*(*p+0) ,*(*p+1),*(*p+2)); //
三、指针数组

首先它是一个数组,定义数组三要素:元素的数据类型 数组名[元素个数];
指针数组格式:指针类型 数组名[元素个数];
数组里面的元素 是 指针 – 是地址。

定义一个数组用来存放 a 的地址和 b 的地址。

int a = 10;
int b = 20;
// 如果存储 a 的地址 -- 指针里面
// 指针指向的对象的类型是 int ---- int *p = &a;
// 如果存储 b 的地址 -- 指针里面
// 指针指向的对象的数据类型 int int *q = &b;
// 使用一个数组存放 p,q,p 和 q 的数据类型都是 int *,也就意味着数组中的元素的类型是 int *;
int *arr[2] = {p,q};
int *arr[2] = {&a,&b};
arr[0] == &a;
arr[1] = &b; 
*(arr[0]) == *(&a) == a; 
*(arr[1]) == *(&b) == b;

在这里插入图片描述

数组指针和指针数组?
数组指针 – 是一个指针 ,定义指针格式:指向对象的数据类型 (*指针名);
int (*p)[3];
指针数组 – 是一个数组,按照数组定义格式:指针类型 数组名[元素的个数];
int *arr[2];

四、二级指针

指针的指针,就是一个用来存放另一个指针的地址,
指针---- 指针变量 – 指针有他单独的空间 – 有空间就有地址,
int a = 10;
int *p = &a;
// 指针定义的格式:指向对象的数据类型 *指针名;
&p;   // p 是指着类型 int *
int * *q = &p; //q == &p;
*q == *(&p) == p

应用场景:一般用于在函数内部改变指针的指向
在这里插入图片描述

五、NULL指针

指针值 – 地址编号为 0 的那个字节。内存里面会开启一块区域不允许用户进行读写操作,
如果定义指针后不确定指针的指向,那么需要让指针指向 NULL;
另外如果一块被指针指向的动态内存空间,使用完后,空间释放,释放后也需要将指针指向 NULL;

六、void指针

void 指针代表一块可以操作的空间,但是这块空间里面存放的数据类型不确定
 动态内存分配-- 在堆区 – 需要人为申请人为释放
 申请函数 malloc 函数 – 头文件 stdlib.h
malloc 函数功能:就是在内存中开辟 n 个字节大小的空间,返回这块空间的首地址。
 malloc(4) — malloc 函数返回值类型是 void
释放空间后 – 释放指针指向的空间。
为了避免误操作,需要将指针空间设置为 NULL

在这里插入图片描述


总结

数组指针和指针数组?
数组指针 ---- 是一个指针 ,定义指针格式:指向对象的数据类型 (*指针名);
int (*p)[3];
指针数组 ---- 是一个数组,按照数组定义格式:指针类型 数组名[元素的个数];
int *arr[2];

二级指针---- 指针的指针,就是一个用来存放另一个指针的地址。

NULL ---- 如果定义指针后不确定指针的指向,那么需要让指针指向 NULL;
另外如果一块被指针指向的动态内存空间,使用完后,空间释放,释放后也需要将指针指向 NULL;

void 指针----void 指针代表一块可以操作的空间,但是这块空间里面存放的数据类型不确定。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前名称:数组与指针、二级指针&NULL&void指针-创新互联
本文URL:http://pwwzsj.com/article/deiccj.html