数组与指针、二级指针&NULL&void指针-创新互联
第一节 C 语言基础以及基本数据类型
第二节 C 语言运算符
第三节 C 语言控制语句
第四节 C 语言自定义函数
第五节 C 语言修饰变量的关键字
第六节 C 语言构造数据类型–数组
第七节 C 语言字符串
第八节 C 语言指针
第九节 指针与函数、指针函数、函数指针
第十节 数组与指针、二级指针&NULL&void 指针
文章目录
- 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 是什么类型。
原理:指针指向谁就保存谁的地址,保存谁的地址就指向谁。
二、数组指针1.数组指针定义int a[3];
元素的类型:int
数组名:a
数组的类型:int [3]
首先这是一个指针,指向的对象是数组,指向对象的类型是数组类型 .
定义一个指针指向 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]
*(*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
应用场景:一般用于在函数内部改变指针的指向
六、void指针指针值 – 地址编号为 0 的那个字节。内存里面会开启一块区域不允许用户进行读写操作,
如果定义指针后不确定指针的指向,那么需要让指针指向 NULL;
另外如果一块被指针指向的动态内存空间,使用完后,空间释放,释放后也需要将指针指向 NULL;
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指针-创新互联
地址分享:http://myzitong.com/article/deiccj.html