2016-10-01 128 views
1

在我关于C++我有以下代码示例教科书:混淆指向数组的指针作为函数参数

using std::cout; 
    using std::endl; 
    int main() { 
     int aArr[4] = { 3,4,2,3 }; 
     int bArr[3] = { 2,3,1 }; 

     cout << "Append: " << endl; 
     printArray(aArr, 4); cout << " + "; printArray(bArr, 3); 
     int* cArr = append(&aArr, bArr); 
     cout << " = "; printArray(cArr, 7); cout << endl; 
     return 0; 


    } 

是否在呼叫中的“&”符号中的“aArr”前附加在主要是指传递了aArr的地址,或者传递了对aArr的引用。

该问题然后要求我实现一个函数追加,它接受两个数组:第一个数组(在第一个参数中)大小为4的数组指针和第二个数组(在第二个参数中)大小为3的数组和指针返回到尺寸7的阵列I已宣布的功能(在适当的头文件)

int* append(int foo[4], int (&secondArray) [3]); 

曾撰文或许放错位置的追加方法中的“&”符号的顺序(即它应该在“bArr”之前)?

+1

&aArr和aArr是实际上,对于静态数组特例同样的事情。 –

+5

阅读*参考*。在不同的情况下,会员意味着不同的事物。在变量声明的上下文中(例如参数声明),它不是地址运算符,而是表示变量是*引用*。 –

+6

@PierreEmmanuelLallemant不,他们事实上不是一回事! – Barry

回答

1

编译器可以帮助你解决这种情况。

让我们假设这是函数原型为您的附加功能:

int* append(int foo[4], int (&secondArray) [3]); 

我可以用这个代码简单的位测试了这一点:

int* append(int foo[4], int (&secondArray) [3]) 
{ 
    return 0; 
} 

int main() { 
    int aArr[4] = { 3,4,2,3 }; 
    int bArr[3] = { 2,3,1 }; 
    int* cArr = append(&aArr, bArr); 
    return 0; 
} 

但是编译器不喜欢这,失败与此错误:

test.cpp(9): error C2664: 'int *append(int [],int (&)[3])': 
      cannot convert argument 1 from 'int (*)[4]' to 'int []' 

正如你可以看到它不喜欢&aArr参数1在第9行,因为它与第1行的函数定义的参数1不匹配。从错误消息来看,它甚至足以给出它认为它们不排队的原因。

现在使用从编译器的提示很明显的作用其实应该是这样的:

int *append(int (*foo)[4], int secondArray[3]) 
{ 
    return 0; 
} 

int main() { 
    int aArr[4] = { 3,4,2,3 }; 
    int bArr[3] = { 2,3,1 }; 
    int* cArr = append(&aArr, bArr); 
    return 0; 
} 

与该改变的编译器是乐于接受的代码是正确的。

现在比较两者,你可以看到不同之处在于第一种情况下第一个参数是以4个整数数组的形式传递的,而在第二种情况下它是作为四个整数数组的地址传递的。

只是从英语你可以告诉这些是两个完全不同的东西。

编辑:下面是该示例的扩展,显示如何访问函数内的数据。

#include <stdio.h> 

int *append(int (*foo)[4], int secondArray[3]) 
{ 
    int *foo1 = *foo; 

    for (int i = 0; i < 4; ++i) 
    { 
     printf("foo: %d\n", foo1[i]); 
    } 
    for (int j = 0; j < 3; ++j) 
    { 
     printf("secondArray: %d\n", secondArray[j]); 
    } 
    return 0; 
} 

int main() { 
    int aArr[4] = { 3,4,2,3 }; 
    int bArr[3] = { 12,13,11 }; 
    int* cArr = append(&aArr, bArr); 
    return 0; 
} 

编译的运行此代码生成以下输出:

foo: 3 
foo: 4 
foo: 2 
foo: 3 
secondArray: 12 
secondArray: 13 
secondArray: 11 
+0

好的谢谢。假设我想循环遍历foo中的元素,我该怎么做。此代码不起作用:for(int i = 0; i <4; i ++){* {foo [i]; \t} – IntegrateThis

+1

@JamesDickens'(* foo)[i]' –

+1

@ M.M lol够了。感谢您的帮助顺便说一句。 – IntegrateThis