C++——指针作为参数传递
在写这一篇之前,受到了两个博主两篇博文(博文1,博文2)的启发,对指针作为参数传递时,有了很大的启发,所以在看完之后并把自己的感悟写出来,对于指针的变化作了更详细的讲解!
1.指针作为参数传递时,是值传递不是引用传递!!!
2.指针在定义时和使用时的含义并不一样,定义时表示的是地址,使用时代表指向的内容。
#include<iostream>
using namespace std;
void test(int *b)
{
cout << "形参指针地址:" << &b << endl;
cout << "形参指向内容:" << *b << endl;
cout << "形参指向内容的地址:" << &(*b) << endl;
cout << "实参和形参指向同一地址,但实参指针变量和形参指针变量自身地址不一致,可以看出传参方式为值传递而并非引用传递" << endl;
cout << endl;
cout << "-----------------" << endl;
*b = 2;
cout << "形参指向内容:" << *b << endl;
}
int main()
{
int num = 1;
int *p = #
cout << "-----------------" << endl;
cout << "实参指针地址:" << &p << endl;
cout << "实参指针指向的地址:" << p << endl;
cout << "num地址:" << &num << endl;
cout << "实参指向内容:" << *p << endl;
test(p);
cout << "实参指向内容:" << *p << endl;
return 0;
}
主函数中,int *p = &num的过程:
当调用test( p )时,情况如下:
在test( p ) 中,我们使用 *b = 2时,就会直接修改0x70fe0c里的值,相当于修改的就是num的值。
当test函数里做一下修改时:
void test(int *b)
{
cout << "形参指针地址:" << &b << endl;
cout << "形参指向内容:" << *b << endl;
cout << "形参指向内容的地址:" << &(*b) << endl;
cout << "实参和形参指向同一地址,但实参指针变量和形参指针变量自身地址不一致,可以看出传参方式为值传递而并非引用传递" << endl;
cout << endl;
cout << "-----------------" << endl;
//修改这里
int num2 = 2;
b = &num2;
cout << "形参指向内容:" << *b << endl;
cout << "形参里存放的地址:" << b << endl;
cout << "num2的地址:" << &num2 << endl;
}
当执行b=&num2时,相当于b中存放num2的地址,也就相当于把b指向num2,在这之后,p和b就不是指向同一个地方了,所以此时修改b的值,与*p无关,也就是与num无关。
还有一个笔试题老碰到的问题:
#include<iostream>
#include<cstring>
using namespace std;
void GetMemory(char *p,int num)
{
p=(char*)malloc(sizeof(char)*num);
}
int main()
{
char *str=NULL;
GetMemory(str,100);
strcpy(str,"hello");
cout<<str<<endl;
return 0;
}
这段程序运行起来,会直接崩溃,因为调用strcpy时,str为NULL,并不能给NULL上去赋值"hello"。具体原因如下:
当我们想要把GetMemory中创建的内存取回来的话,就要用到双指针,也就是指针的指针。
#include<iostream>
#include<cstring>
using namespace std;
void GetMemory(char **p,int num)
{
*p=(char*)malloc(sizeof(char)*num);
}
int main()
{
char *str=NULL;
GetMemory(&str,100);
strcpy(str,"hello");
cout<<str<<endl;
return 0;
}