初始化指向数组c ++的指针

时间:2014-10-18 14:43:52

标签: c++ arrays

我是C ++的新手。请参阅以下代码:

//sample1
int arr[2]  = { 11, 22 };
int(*t)[2];
t = &arr;
cout << *t[0] << "\n";
cout << *t[1] << "\n";


//sample2
int arr2[2];
arr2[0] = { 33 };
arr2[1] = { 44 };
int(*t2)[2];
t2 = &arr2;
cout << *t2[0] << "\n";
cout << *t2[1] << "\n";


//sample3
int arr3[2];
arr3[0] = { 55 };
arr3[2] = { 66 };
int(*t3)[2];
t3 = &arr3;
cout << *t3[0] << "\n";
cout << *t3[1] << "\n";

//输出

11
-858993460
33
-858993460
55
66

有人能告诉我如何初始化指向数组的指针吗?Sample3不符合我的理解。

3 个答案:

答案 0 :(得分:1)

您的代码存在两个问题:

1)[]的优先级高于*,因此在所有这些情况下都需要括号(cfr。operator precedence)。如果你不使用它们,你将在每个2个整数的数组上进行指针运算(因此立即超出范围),例如。

int(*t)[2]; // A pointer to an array of 2 integers
cout << t[0]; // The address of the array

[first_integer][second_integer] ... garbage memory ...
^

cout << t[1]; // The address of the array + sizeof(int[2])

[first_integer][second_integer] ... garbage memory ...
                               ^
cout << *t[0]; // Dereference at the address of the array
cout << *t[1]; // Dereference past the end of the array

//  ---- correct -----

cout << (*t)[0]; // Dereference the pointer to the array and get the element there

[first_integer][second_integer] ... garbage memory ...
^

cout << (*t)[1]; // Dereference the pointer to the array and get the second element there

[first_integer][second_integer] ... garbage memory ...
               ^    

2)您在

行有一个超出范围的访问权限
arr3[2] = { 66 };

这是你应该如何进行的:

//sample1
int arr[2] = { 11, 22 };
int(*t)[2];
t = &arr;
cout << (*t)[0] << "\n";
cout << (*t)[1] << "\n";


//sample2
int arr2[2];
arr2[0] = { 33 };
arr2[1] = { 44 };
int(*t2)[2];
t2 = &arr2;
cout << (*t2)[0] << "\n";
cout << (*t2)[1] << "\n";


//sample3
int arr3[2];
arr3[0] = { 55 };
arr3[1] = { 66 };
int(*t3)[2];
t3 = &arr3;
cout << (*t3)[0] << "\n";
cout << (*t3)[1] << "\n";

初始化就好了。

答案 1 :(得分:1)

数组与指针几乎相同:

int arr[2]  = { 11, 22 };
int * t;
t = arr;
cout << t[0] << "\n";
cout << t[1] << "\n";

答案 2 :(得分:0)

在此代码段中

//sample3
int arr3[2];
arr3[0] = { 55 };
arr3[2] = { 66 };
int(*t3)[2];
t3 = &arr3;
cout << *t3[0] << "\n";
cout << *t3[1] << "\n";

定义了一个包含两个元素的数组。此数组元素的有效索引范围是0, 1 在本声明中

arr3[2] = { 66 };

尝试在数组之外写入数据,因为索引2无效。你有

arr3: | 55 | uninitilaized | 66 |
index:   0        1          beyond the array

在这些陈述之后

int(*t3)[2];
t3 = &arr3;

指针t3指向数组arr3,

表达

t3[0]

给出数组arr3

表达

*t3[0] 

给出数组的第一个元素。因此声明

cout << *t3[0] << "\n";

输出55。

表达

t3[1]

指向(超出)数组arr3之后的内存。你在这个地址值66处写道。所以这个值是由语句

输出的
cout << *t3[1] << "\n";

当然,这段代码片段无效,因为它的覆盖内存不是为代码对象保留的。