【每日C/C++问题】
一、C/C++中数组定义和初始化的方式有哪些?
int arr[100]; // 定义了数组arr,并未对数组进行初始化int arr[100] = {1, 2}; // 定义并初始化了数组arr前两个元素,其他元素为0int arr[3] = {1, 2, 3}; // 定义并初始化了数组arr所有元素int arr[] = {1, 2, 3}; // 不指定大小,根据初始化值确定数组大小int *arr = new int[100]; //定义了数组arr,并未对数组进行初始化,不用时需要用delete [] 释放int *arr = new int[100](); //定义了数组arr,默认初始化为0,不用时需要delete [] arr
// 使用循环初始化数组元素
int arr[5];
for (int i = 0; i < 5; i++) {arr[i] = i;
}
数组元素为1,2,3,4,5
二、数组名字有什么含义?
1. 数组名代表数组首元素的地址:
int a[3], *p = a; // a表示数组首元素的地址//此时 p + 1 与 a + 1 等价都指向数组的第二个元素
2. 在一些特殊情况下,如sizeof中数组名代表整个数组
// x64 指针变量(地址)占8个字节
// x86 指针变量(地址)占4个字节
//该示例编译环境为 x86
#include<iostream>
using namespace std;
#include <string>
int main() {int a[5] = { 1,2,3,4,5 };cout << sizeof(a) << endl; // a代表整个数组cout << sizeof(a + 0) << endl; // a进行运算代表数组首元素地址cout << sizeof(*a) << endl; // a代表数组首元素地址,*a 为 a[0]cout << sizeof(a + 1) << endl; // a进行运算代表数组首元素地址,a + 1 代表a[1]的地址 cout << sizeof(a[1]) << endl; // a[1]为int类型变量占四个字节cout << sizeof(&a) << endl; // &a 在数值上与 a 和 &a[0] 相等,&a 数值上等于整个数组的起始位置地址,含义上代表整个数组所占内存的大小,因为它的进阶单位是整个数组的字节长度,(&a + 1)等于的是数组结束之后的下一段的起始位置地址。cout << sizeof(*&a) << endl; // * 和 & 抵消掉 a 代表整个数组cout << sizeof(&a + 1) << endl; // (&a + 1)等于的是数组结束之后的下一段的起始位置地址。cout << sizeof(&a[0]) << endl; // x86 指针变量(地址)占4个字节cout << sizeof(&a[0] + 1) << endl; // x86 指针变量(地址)占4个字节,&a[0] + 1 表示的是 a[1] 的地址return 0;
}
&a 在数值上与 a 和 &a[0] 相等,&a 数值上等于整个数组的起始位置地址,含义上代表整个数组所占内存的大小,因为它的进阶单位是整个数组的字节长度,(&a + 1)等于的是数组结束之后的下一段的起始位置地址。
输出
20
4
4
4
4
4
20
4
4
4