84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
#include <iostream> using namespace std; int main() { char*a[]={"zzzz","zz","zzzzzzz"}; cout << sizeof(a) << endl; return 0; }
为什么输出是24呢?为什么数组的大小不是5 + 3 + 8 = 16呢?
24
5 + 3 + 8 = 16
欢迎选择我的课程,让我们一起见证您的进步~~
a存放的是三个字符串常量的地址,并不是直接存放3个字符串,一个地址也就是一个指针
a
|----------| | xxxxxx | |----------| |--------| a --> | pointer1 | -----> | "zzzz" | |----------| |--------| |------| | pointer2 | ---------------------> | "zz" | |----------| |-----------| |------| | pointer3 | -----> | "zzzzzzz" | |----------| |-----------| | xxxxx |
sizeof(a) == 3 * sizeof(pointer) = 24
如果你是32位操作系统,则指针长度是4字节,64位是8字节,可以推算出你的编译环境是64位的
C/C++ 的声明并不能从左往右阅读,而是要先找到标识符,光标向右,待右侧没有东西时,光标向左,待左侧没有东西时,进入上一层括号重复第一步,待没有上一层括号时,结束。[1]
也就是说,char* a[] 意味着,
char* a[]
a is an array of pointers to char's
当使用字符串字面量初始化 char* 时,该指针变量中存放的是字符串常量在内存中的地址。
char*
这也就是说,
sizeof(a) == 3 * sizeof(char*)
在 64-bit 系统中,
sizeof(char*) == 8
所以
sizeof(a) == 24
另外,C/C++ 中的数组的大小,恒等于数组中单个元素的大小乘以数组中元素的个数
这也就是说,无论何时,计算数组的大小,都不会出现几个不相等的数相加的情况。
如果你希望一个变量占用的内存空间等于其中各部分之和,可以这样写:
#include <stdio.h> int main() { struct a { char a[5]; char b[3]; char c[8]; } a = {"zzzz", "zz", "zzzzzzz"}; printf("%lu\n", sizeof(a)); // 16 = 5 + 3 + 8 }
a
存放的是三个字符串常量的地址,并不是直接存放3个字符串,一个地址也就是一个指针如果你是32位操作系统,则指针长度是4字节,64位是8字节,可以推算出你的编译环境是64位的
C/C++ 的声明并不能从左往右阅读,而是要先找到标识符,光标向右,待右侧没有东西时,光标向左,待左侧没有东西时,进入上一层括号重复第一步,待没有上一层括号时,结束。[1]
也就是说,
char* a[]
意味着,当使用字符串字面量初始化
char*
时,该指针变量中存放的是字符串常量在内存中的地址。这也就是说,
在 64-bit 系统中,
所以
另外,C/C++ 中的数组的大小,恒等于数组中单个元素的大小乘以数组中元素的个数
这也就是说,无论何时,计算数组的大小,都不会出现几个不相等的数相加的情况。
如果你希望一个变量占用的内存空间等于其中各部分之和,可以这样写: