一、数组参数:
1 //数组作为参数,编译器会把它解释为一个指向其首元素首地址的指针; 2 void func(char a[],int length){ 3 //a表示的是首元素的首地址,a+3表示的是数组第三个元素的首地址 4 //数组下标和指针形式访问都行; 5 cout<<a[3]<<endl; 6 cout<<*(a+3)<<endl; 7 *(a+3) ='o'; //*(地址) 就能访问和修改这个地址上的值了,也就是访问和修改数组的某个元素了; 8 } 9 10 int main() 11 { 12 //其实就是拷贝了一个指针,但是修改的是同一份数组 13 char b[5] = "abcd"; 14 func(b,5); 15 cout<<b[3]<<endl; 16 return 0; 17 18 19 }
所以数组是没有副本拷贝进函数的。拷贝的只是一个指向数组首元素首地址的指针;通过该指针来操作原始的数组;
数组没有进行拷贝是因为这样做的开销很大。很多情况下我们并需要整个数组的拷贝;
所以不拷贝数组,节省了空间和时间,提高了程序运行的效率;
二、指针参数:
1 void func(const char *p){ 2 char c = p[3]; //也可以使用*(p+3) 3 cout <<c<<endl; 4 cout <<"Address of p "<<&p<<endl; 5 cout <<"Value of p:"<<p<<endl; 6 } 7 8 int main() 9 { 10 const char *ptr = "adcde"; 11 cout <<"Address of p "<<&ptr<<endl; 12 cout <<"Value of p:"<<ptr<<endl; 13 func(ptr); 14 15 char a = 'a'; 16 char * ptrs = &a; 17 cout <<"Value of ptrs:"<<ptrs<<endl; 18 19 int num = 5; 20 int * num_ptr = # 21 cout <<"Value of num_ptr:"<<num_ptr<<endl; 22 return 0; 23 24 }
这里发现一个现象,如果指针是指向字符类型的变量,指针被赋值后,直接打印指针的话,显示的是所指的字符串,而不是地址;
如果换成指向int的指针,被赋值后,直接打印指针的话,显示的所指int变量的地址;
按理说直接打印指针变量,应该显示地址才是,这块有待探究。