C++Review14_数组参数和指针参数

一、数组参数:

 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 = &num;
21     cout <<"Value of num_ptr:"<<num_ptr<<endl;
22     return 0;
23 
24 }

这里发现一个现象,如果指针是指向字符类型的变量,指针被赋值后,直接打印指针的话,显示的是所指的字符串,而不是地址;

如果换成指向int的指针,被赋值后,直接打印指针的话,显示的所指int变量的地址;

按理说直接打印指针变量,应该显示地址才是,这块有待探究。

猜你喜欢

转载自www.cnblogs.com/grooovvve/p/12370698.html