new表达式返回数组首元素地址还是整个数组地址?如何访问动态数组元素?
关于C++中new数组的常见问题解答
问题1:new int[]返回的是数组首元素的地址还是整个数组的地址?
对于代码:
int *a = new int[16];
new int[16]返回的是数组首元素的地址。在C++中,动态分配数组时返回的指针类型是指向数组元素类型的指针(此处为int*),它指向数组的第一个元素。不存在所谓“整个数组的地址”——数组的起始地址本质上就是首元素的地址,数组本身没有额外的独立地址标识。
问题2:后续该如何访问这个数组?变量a存储的是整个数组的地址还是仅首元素的地址?
- 访问数组的两种常用方式:
- 数组下标语法:
a[i],其中i取0到15的整数(对应数组16个元素),直接访问第i+1个元素。 - 指针偏移语法:
*(a + i),通过指针偏移间接访问元素,效果和a[i]完全等价。
- 数组下标语法:
- 变量
a存储的是首元素的地址。因为a的类型是int*,只能存储单个int类型的地址,也就是数组第一个元素的内存地址。
问题3:该如何访问结构体数组中的元素?
对于给定的结构体数组代码:
struct student { string name; int age; }; int num_students = get_number_of_students(); struct student *students = new student[num_students];
访问结构体数组元素的方式和普通数组类似,常见两种写法:
- 下标访问(推荐,可读性更高):
使用students[i]获取第i个student结构体(i从0到num_students-1),然后通过成员访问符.获取结构体成员:// 访问第i个学生的姓名和年龄 cout << students[i].name << endl; cout << students[i].age << endl; - 指针偏移访问:
通过students + i得到指向第i个结构体的指针,然后使用->访问成员(或先解引用再用.):// 两种等价写法 cout << (students + i)->name << endl; cout << (*(students + i)).age << endl;
内容的提问来源于stack exchange,提问作者user20055175
相关产品推荐
相关产品推荐

