通常,指向数组第一个元素的指针会传入函数,同时还需传入数组的大小(后面会详细解释)
void by_pointer(int *p, int size); void by_pointer(int p[], int size); void by_pointer(int p[7], int size); // the 7 is ignored in this context!
注意如果按照下面的方式打印数组
void printArray(int data[]) { for(int i = 0, length = sizeof(data); i < length; ++i) { std::cout << data[i] << ' '; } std::cout << std::endl; }
你会发现数组中只有前面的四个元素被打印,这是因为sizeof(data)返回的实际是指针的大小4. 原因是在这个过程中,数组没有被复制,被复制的是指向数组第一个元素的指针。
有一个公式num_elements = sizeof( array ) / sizeof( array[0] )可以计算出数组中元素的个数, 但是使用的时候也是有陷阱的 #include <iostream> using std::cout;
int a[] = { 1, 2, 3, 4, 5 };
int counta() { return sizeof( a ) / sizeof( a[ 0 ] ); // works, since a[] is an array }
int countb( int b[] ) { return sizeof( b ) / sizeof( b[ 0 ] ); // fails, since b[] is a pointer }
int main() { cout << "The size of a is " << counta() << endl; cout << "The size of b is " << countb( a ) << endl; }
在 counta(), 编译器知道全局变量a的类型,包括它的大小
In countb(), 编译器其实把参数b[]看成指针*b,它并不知道指针b所指向的数组的大小