char (*str)[2] 与 char * str[2]

简介

该文章主要介绍char (*str)[2]char * str[2]之间的区别,其实也就是我们经常所说的数组指针指针数组的区别。

ps:之所以选用char (*str)[2] 与 char * str[2]作为文章题目而不是数组指针指针数组,个人认为后者太容易搞混了,感觉还是记住两句代码更简单点。

char *str[2]

这就是我们常说的指针数组(array of pointrs)

  • 首先这是一个数组,数组中包含两个数据
  • 数组中包含的数据为char类型的指针

例程

#include <iostream>
int main()
{
    char s[2] = { 'Z','K' };
    char *str[2];
    str[0] = &s[0];
    str[1] = &s[1];
    std::cout << "sizeof(str):"
        << sizeof(str) << std::endl;
    std::cout << "s[0] address:" << (void*)str[0] << "\n";
    std::cout << "s[1] address:" << (void*)str[1] << "\n";
    system("pause");
    return 0;
}
//输出结果
sizeof(str):8
s[0] address:004FFD78
s[1] address:004FFD79
  • sizeof(str):8 因为str数组包含两个指针,所以长度是8
  • 存储的两个地址为0x004FFD78与0x004FFD79,因为指向的是两个char,所以地址相差一个字节

char(*str)[2]

这就是常说的数组指针(a pointer to an array).

  • 首先它是一个指针
  • 该指针指向一个char[2]的数组,且只能指向一个char[2]的数组

例程

#include <iostream>

int main()
{
    char s[2] = { 'Z','K'};
    char (*str)[2];
    str = &s; //注意这里的&符号,这里我们把s[2]作为一个整体,当取址的时候,需要使用取址符
    std::cout << "sizeof (*str):" << sizeof(str) << "\n";
    std::cout << "s[0] address:" << (void*)&s[0] << "\n";
    std::cout << "str:" << str << "\n";
    std::cout << "str+1:" << (str + 1) << "\n";
    system("pause");
    return 0;
}
//输出结果
sizeof (*str):4
s[0] address:0026F950
str:0026F950
str+1:0026F952
  • sizeof(*str):4 因为str只是一个指针而已,所以长度为4
  • str所存储的地址与s[0]的地址是相同的,为char[2]的首地址
  • str+1得到的结果与str相差两个字节,因为str指向的是一个数组,所以当指向加1操作的时候,相加的值为数组的总长度
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解...
    有理想有暴富的小青年阅读 3,652评论 0 4
  • C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程...
    小辰带你看世界阅读 4,492评论 0 6
  • 多线程、特别是NSOperation 和 GCD 的内部原理。运行时机制的原理和运用场景。SDWebImage的原...
    LZM轮回阅读 6,096评论 0 12
  • 风过时 舞姿肆意起 雨落时 平仄追玉盘 花开时 艳不争而华自发 每一次掉落 都是奔赴冒险 每一次化泥 都是为梦重生...
    壹茶阅读 1,937评论 0 0
  • 纵你只身向前 因为我深知 无论走到哪终点都是你身旁
    北极寻鹿人阅读 1,560评论 0 0