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++知识库]指针数组与数组指针

指针数组与数组指针

前言:

对于c语言初学者对这两个概念常常弄混,我当时刚学时,去看大佬博客,大佬们写的很多,强忍着看完了,觉得自己看懂了,接着就下一个知识点了,过了两天又忘了。。。编程的学习绝对是不能脱离实际的,实践是检验真理的唯一标准,所以检验自己到底会不会直接写代码检验一下是最好的(这里可不是让你背博客代码,也不是让你抄写,而是看会了之后用自己的方式实现一下,不看任何参考代码)。下面我将用代码的形式清晰的给你展示这两者的区别!

指针数组:

定义:类型 *名字[数组大小],如char *p[6];

首先看一下这个结构,看到有’[ ]'符号,这是一个数组你应该没有疑问,数组的元素是啥呢?是char *指针。你可以对比正常数组来看,如 int arr[6],这你肯定知道,这是一个大小为6的数组,数组里存储的元素类型为int类型。这样你再看 char *p[6],是不是就清晰多了。这是一个大小为6的数组,里面存储的是char *类型的指针,数组名字是p。ok,这回我们知道什么是指针数组了!啥你说你还不清楚!世上无难事,只要肯放弃,咱不学编程了!好的,既然你懂什么是指针数组,那么就和我一起来编程吧!

#include <stdio.h>

int main(int argc, char **argv)
{
    //定义大小为6的指针数组,数组元素是char*
    char *p[6];
    //将第一个指针赋值为hello
    p[0] = "hello";

    printf("p[0] = %s\n", p[0]);
    return 0;
}

我相信上面的代码你应该没有问题,给指针数组里的第一个指针赋值为“hello"。打印结果是hello。接下来我们继续学习

#include <stdio.h>

int main(int argc, char **argv)
{
    char arr[2][6] = {"hello", "world"};
    char *p[2];

    //将二维数组的第一行赋值给指针数组的第一个指针
    p[0] = arr[0];

    //打印结果很明显是p[0] = hello
    printf("p[0] = %s\n", p[0]);


    //下面我们想打印指针数组的第二个指针指向的内容,结果是啥呢?是world?
    //还是其它什么未知的内容
    printf("p[1] = %s\n", p[1]);

    //当你把上面的p[1]打出来的时候,发现是乱码的值,啥原因呢?
    //你没给指针数组的第二个指针赋值啊,所以第二个指针指向内存一块未知的区域
    //那么肯定是乱码啊,这里你可不要天真的认为,将二维数组的第一行数据赋值给指针数组的第一个数据,
    //那么指针数组的第二个指针就默认指向二维数组的第二行数据。这个想法是错误的
    p[1] = arr[1];
    //这样打出来的结果才是p[1] = world;
    printf("p[1] = %s\n", p[1]);

    return 0;
}

我们换个赋值方式

#include <stdio.h>

int main(int argc, char **argv)
{
    char arr[2][6] = {"hello", "world"};
    char *p[6];

    *p = *arr;
    p[1] = arr[1];

    printf("*p = %s\n", *p);
    //打印结果是什么?比较容易,是*p = hello;
    

    //思考一下,这个打印的结果是什么?
    printf("*p+1 = %s\n", *p+1);
    //结果是:*p+1 = ello, 是否是你心中的结果呢?下面来分析一下,为啥是这个结果!
    //首先*p+1还是指针数组的第一个元素,啥你和我说是第二个? '*'的优先级是要高于'+'
    //所以它其实应该长这样(*p)+1;这回清晰了吧,首先*p指向hello字符串,然后向后偏移了一个字符
    //所以结果是ello
    
    //思考一下,这个打印的结果是什么?
    printf("*(p+1) = %s\n", *(p+1));
    //没错就是*(p+1) = world!这回你可看好了哈,我将p+1用()给包起来了,所以先对指针数组进行
    //偏移,然后再*,取该指针所指向的内容。
    
    //大声说出来,下面打印的内容是啥!
    printf("*(p+1)+2 = %s\n", *(p+1)+2);
    //没错就是*(p+1)+2 = rld这个!

    return 0;
}

学到这里我相信你对指针数组已经有了较深刻的理解了,那么现在自己实践一下!实践完成之后,接下来我们学习一下数组指针!

数组指针

定义:类型 ( *名字)[数组大小], 如:char ( *p)[10];

首先看结构,看到有’[ ]'符号,这是一个数组你应该没有疑问,数组的元素是啥呢?是char类型,p是指针,指向包含10个char元素的一维数组。

#include <stdio.h>

int main(int argc, char **argv)
{
    char arr[2][6] = {"hello", "world"};

    //需要注意的是,如果想用p指向二维数组,那么数值指针的大小要和二维数组的列大小要相同
    //否则会出现存储不匹配,可以自行尝试
    char (*p)[6];

    //p指向arr[0], 这里也可以不进行类型转换,会报warning,但是不影响运行结果
    p = (char(*)[6])arr;


    //下面打印的结果是啥呢?
    printf("*p = %s\n", *p);
    //没错就是*p = hello
    

    printf("*p+1 = %s\n", *p+1);
    //打印结果: *p+1 = ello
    
    printf("*(p+1) = %s\n", *(p+1));
    //打印结果: *(p+1) = world
    
    printf("*p[1] = %c\n", *p[1]);
    //打印结果: *p[1] = w, p[1]指向二维数组的第二行的第一个元素,所以是w

    //思考一下下面两个打印打印啥?
    printf("*p[1]+2 = %c\n", *p[1]+2);
    //打印结果:*p[1]+2 = y, *p[1]是w,那么'w'+2 不就是'y'么!wxyz

    printf("*(p[1]+1) = %c\n", *(p[1]+1));
    //打印结果: *(p[1]+1) = o, p[1]指向二维数组的第二行的第一个元素,那么p[1]+1
    //不就是指向第二行的第二个元素了么!

    return 0;
}

通过上面的代码我相信你肯定对数值指针有了较深刻的认识,就现在去用代码写一下吧!

总结

  1. 指针数组:本质上是数组,数组里面存储是指针
  2. 数组指针:本质上是指针,指针指向一个一维数组

本人能力有限,如有错误望各位大佬不吝指正,原创不易,转载请注明出处!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-11 18:37:21  更:2021-09-11 18:40:16 
 
开发: 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/23 20:53:20-

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