IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C语言使用指针数组存取数组(指针数组与数组) -> 正文阅读

[数据结构与算法]C语言使用指针数组存取数组(指针数组与数组)

一、定义字符数组和字符指针数组

 	char str[32]={};
    char str1[32]={};
    char str2[32]={};
    char *sensordata[32];

个人理解:字符数组即一级指针,指针数组是二级指针,指向字符数组的地址或者一级指针的地址;

二、打印指针数据的基地址和指针的指向

	printf("--------------指针数组的基地址-------------\n");
    printf("sensordata[0]的地址: %p\n",&sensordata[0]);
    printf("sensordata[1]的地址: %p\n",&sensordata[1]);
    printf("sensordata[2]的地址: %p\n",&sensordata[2]);

	printf("\n--------------指针数组的下标指向-------------\n");
    printf("sensordata[0]的地址: %p\n",sensordata[0]);
    printf("sensordata[1]的地址: %p\n",sensordata[1]);
    printf("sensordata[2]的地址: %p\n",sensordata[2]);

打印结果:
--------------指针数组的基地址-------------
sensordata[0]的地址: 0x7ffcbe058c10
sensordata[1]的地址: 0x7ffcbe058c18
sensordata[2]的地址: 0x7ffcbe058c20

--------------指针数组的下标指向-------------
sensordata[0]的地址: 0x7ffcbe058d10
sensordata[1]的地址: 0x3
sensordata[2]的地址: 0x7ffcbe058d00

  • 由此可知,指针数组的的基地址也是按顺序的,相隔下标相差0x08.
  • 指针数组里面存储的指针指向不确定的,随机的,无法知道指针数组指向的空间大小;

三、指针数组的下标指向字符数组,并格式化字符数组的内容

//指针数组的下标指向到数组
    sensordata[0]=str;
    sensordata[1]=str1;
    sensordata[2]=str2;
    
    //格式化数组的内容,sprintf是不安全的函数,会导致缓存区溢出
    sprintf(str,"airH:%.2f ",76.83);
    sprintf(str1,"airT:%.2f ",26.50);
    sprintf(str2,"ill:%d ",356);
    
    printf("\n--------------打印数组的内容-------------\n");
    printf("str0的数据:  %s\n",str);
    printf("str1的数据:  %s\n",str1);
    printf("str2的数据:  %s\n",str2);
    
    printf("\n--------------打印指针数组下标指向的内容-------------\n");
    printf("sensordata[0]的数据: %s\n",sensordata[0]);
    printf("sensordata[1]的数据: %s\n",sensordata[1]);
    printf("sensordata[2]的数据: %s\n",sensordata[2]);

运行效果:
--------------打印数组的内容-------------
str0的数据: airH:76.83
str1的数据: airT:26.50
str2的数据: ill:356

--------------打印指针数组下标指向的内容-------------
sensordata[0]的数据: airH:76.83
sensordata[1]的数据: airT:26.50
sensordata[2]的数据: ill:356

  • 指针数组的下标指向字符数组中,确定指针数组的指针指向;
  • 使用sprintf格式化字符数组的内容,格式化的数据不能超过字符数据的长度,否则会引起内存溢出;
  • 因指针数组里面的下标指向了字符数组,所以可以通过下标直接获取数组的数据;

四、打印字符数组的基地址和指针数组的指针指向

printf("\n--------------数组的基地址-------------\n");
    printf("str的地址:  %p\n",str);
    printf("str1的地址:  %p\n",str1);
    printf("str2的地址:  %p\n",str2);
    
    printf("\n--------------指针数组的指向的地址-------------\n");
    printf("sensordata[0]的地址: %p\n",sensordata[0]);
    printf("sensordata[1]的地址: %p\n",sensordata[1]);
    printf("sensordata[2]的地址: %p\n",sensordata[2]);

运行效果:
--------------数组的基地址-------------
str的地址: 0x7ffcbe058d10
str1的地址: 0x7ffcbe058d30
str2的地址: 0x7ffcbe058d50

--------------指针数组的指向的地址-------------
sensordata[0]的地址: 0x7ffcbe058d10
sensordata[1]的地址: 0x7ffcbe058d30
sensordata[2]的地址: 0x7ffcbe058d50
可见,指针数组里面的指针指向和字符数组的基地址一样,从而实现指针数据对数组的储存和获取操作!

五、完整测试代码和效果显示

//gcc 7.4.0

#include  <stdio.h>
#include <string.h>

int main(void)
{
    char str[32]={};
    char str1[32]={};
    char str2[32]={};
    char *sensordata[32];
    
    printf("--------------指针数组的基地址-------------\n");
    printf("sensordata[0]的地址: %p\n",&sensordata[0]);
    printf("sensordata[1]的地址: %p\n",&sensordata[1]);
    printf("sensordata[2]的地址: %p\n",&sensordata[2]);
    
    printf("\n--------------指针数组的下标指向-------------\n");
    printf("sensordata[0]的地址: %p\n",sensordata[0]);
    printf("sensordata[1]的地址: %p\n",sensordata[1]);
    printf("sensordata[2]的地址: %p\n",sensordata[2]);
    
    //指针数组的下标指向到数组
    sensordata[0]=str;
    sensordata[1]=str1;
    sensordata[2]=str2;
    
    //格式化数组的内容,sprintf是不安全的函数,会导致缓存区溢出
    sprintf(str,"airH:%.2f ",76.83);
    sprintf(str1,"airT:%.2f ",26.50);
    sprintf(str2,"ill:%d ",356);
    
    printf("\n--------------打印数组的内容-------------\n");
    printf("str0的数据:  %s\n",str);
    printf("str1的数据:  %s\n",str1);
    printf("str2的数据:  %s\n",str2);
    
    printf("\n--------------打印指针数组下标指向的内容-------------\n");
    printf("sensordata[0]的数据: %s\n",sensordata[0]);
    printf("sensordata[1]的数据: %s\n",sensordata[1]);
    printf("sensordata[2]的数据: %s\n",sensordata[2]);
    
    
    printf("\n--------------数组的基地址-------------\n");
    printf("str的地址:  %p\n",str);
    printf("str1的地址:  %p\n",str1);
    printf("str2的地址:  %p\n",str2);
    
    printf("\n--------------指针数组的指向的地址-------------\n");
    printf("sensordata[0]的地址: %p\n",sensordata[0]);
    printf("sensordata[1]的地址: %p\n",sensordata[1]);
    printf("sensordata[2]的地址: %p\n",sensordata[2]);
    printf("sensordata的数据: %s\n",sensordata);
    
    return 0;
}
Compilation time: 0.44 sec, absolute running time: 0.15 sec, cpu time: 0 sec, memory peak: 5 Mb, absolute service time: 0,69 sec
--------------指针数组的基地址-------------
sensordata[0]的地址: 0x7ffcbe058c10
sensordata[1]的地址: 0x7ffcbe058c18
sensordata[2]的地址: 0x7ffcbe058c20

--------------指针数组的下标指向-------------
sensordata[0]的地址: 0x7ffcbe058d10
sensordata[1]的地址: 0x3
sensordata[2]的地址: 0x7ffcbe058d00

--------------打印数组的内容-------------
str0的数据:  airH:76.83 
str1的数据:  airT:26.50 
str2的数据:  ill:356 

--------------打印指针数组下标指向的内容-------------
sensordata[0]的数据: airH:76.83 
sensordata[1]的数据: airT:26.50 
sensordata[2]的数据: ill:356 

--------------数组的基地址-------------
str的地址:  0x7ffcbe058d10
str1的地址:  0x7ffcbe058d30
str2的地址:  0x7ffcbe058d50

--------------指针数组的指向的地址-------------
sensordata[0]的地址: 0x7ffcbe058d10
sensordata[1]的地址: 0x7ffcbe058d30
sensordata[2]的地址: 0x7ffcbe058d50
sensordata的数据: ���

同时推荐一个在线编译器可以直接在网页上面测试案例;

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 12:01:52  更:2022-04-26 12:06:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:39:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码