指针做形参与作为返回值问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
printf("%s\n",pName); //输出DB,因为char *pName = "DB";已经使得pName指向了DB,但c(2,pName);并不能改变pName指向的地址。
//形象点说就是:我有一个箱子给你用,你可以在里面装东西,但是你不能把我的箱子换成另外一个给我。
//在这里指的是不能函数调用不能使pName变成函数中的二维数组a。
printf("copy string a to string b:\n");
copy(a,b);
printf("\nstring a = %s\nstring b = %s\n",a,b);
}
void copy(char *from, char *to)
{
for(;*from!='\0';from++, to++)
int i =0;
}
void change2(char*&name)
{
name="alter";
//*name =‘a’;此句错误,试图修改常字符串中的某个字符。
}
void main()
{
char * str="original!";
change1(str);
cout << str << endl;
scanf("%d",&n);
}
示例2:
#include<stdio.h>
main()
{
void copy(char *from, char *to);
char *a = "linux";
char *b = "windows";
printf("\nstring a = %s\nstring b = %s\n",a,b);
change2(str);
cout << str <<endl;
}
结果:original!;alter。change1是值传递,形参name有自己独立的内存地址,内容是拷贝string的内容(string的内容是”original”的地址),修改后name的内容变成了“alter”的地址。change2是引用传递,形参name的地址就是string的地址,或者说name就是string
{
char *a[4] = {"aaa","bbb","ccc","ddd"};
pName = a[n];
}
void main()
{
int n=0;
char*pName= "DB";
printf("%s\n",a());//输出ZET
printf("%s\n",b());//随机输出乱码
c(2,pName);//试图改变指针的值(指针的指向)
return d;
}//已验证,没错。严重误区,容易错
//但是第二个数组空间是系统维护的,函数执行完自动销毁
char *b()
{
char p[10] = {"3G平台"};
return p;
}
//参数是值传递方式,改变形参的地址,传递的实参的地址确不会因此改变
void c(int n,char *pName)
返回类型为指针以及指针作为参数传递示例:
示例1:
#include <stdio.h>
//此函数中d也是个局部变量,函数执行完自动销毁,但是指针分配的空间不会被自动回收,除非程序员delete掉。
//所以这个可以正常输出。
char *a()
{
char *d = "ZET";//这个初始化的一种形式,相当于分配了四个空间
*to = *from;
*to = '\0';
}
上面*to = 百度文库from;出错,调试信息显示
lianxi.exe中的0x001f14a4处有未经处理的异常: 0xC0000005:写入位置0x001f5784时发生访问冲突,因为a,b分别指向的是常量字符串,无法试图修改其值,因为其为只读。
改成:
char a[] = "linux";
char b[] = "windows";
便可以了。
char *a = "linux";
char *b = "windows";
a,b是指向常量数据的指针,所指向的内容是只读的(常量字符串不能修改其值)。。
示例3:
void change1(char* name)
{
//*name='a';
name = "alter";
//形象点说就是:我有一个箱子给你用,你可以在里面装东西,但是你不能把我的箱子换成另外一个给我。
//在这里指的是不能函数调用不能使pName变成函数中的二维数组a。
printf("copy string a to string b:\n");
copy(a,b);
printf("\nstring a = %s\nstring b = %s\n",a,b);
}
void copy(char *from, char *to)
{
for(;*from!='\0';from++, to++)
int i =0;
}
void change2(char*&name)
{
name="alter";
//*name =‘a’;此句错误,试图修改常字符串中的某个字符。
}
void main()
{
char * str="original!";
change1(str);
cout << str << endl;
scanf("%d",&n);
}
示例2:
#include<stdio.h>
main()
{
void copy(char *from, char *to);
char *a = "linux";
char *b = "windows";
printf("\nstring a = %s\nstring b = %s\n",a,b);
change2(str);
cout << str <<endl;
}
结果:original!;alter。change1是值传递,形参name有自己独立的内存地址,内容是拷贝string的内容(string的内容是”original”的地址),修改后name的内容变成了“alter”的地址。change2是引用传递,形参name的地址就是string的地址,或者说name就是string
{
char *a[4] = {"aaa","bbb","ccc","ddd"};
pName = a[n];
}
void main()
{
int n=0;
char*pName= "DB";
printf("%s\n",a());//输出ZET
printf("%s\n",b());//随机输出乱码
c(2,pName);//试图改变指针的值(指针的指向)
return d;
}//已验证,没错。严重误区,容易错
//但是第二个数组空间是系统维护的,函数执行完自动销毁
char *b()
{
char p[10] = {"3G平台"};
return p;
}
//参数是值传递方式,改变形参的地址,传递的实参的地址确不会因此改变
void c(int n,char *pName)
返回类型为指针以及指针作为参数传递示例:
示例1:
#include <stdio.h>
//此函数中d也是个局部变量,函数执行完自动销毁,但是指针分配的空间不会被自动回收,除非程序员delete掉。
//所以这个可以正常输出。
char *a()
{
char *d = "ZET";//这个初始化的一种形式,相当于分配了四个空间
*to = *from;
*to = '\0';
}
上面*to = 百度文库from;出错,调试信息显示
lianxi.exe中的0x001f14a4处有未经处理的异常: 0xC0000005:写入位置0x001f5784时发生访问冲突,因为a,b分别指向的是常量字符串,无法试图修改其值,因为其为只读。
改成:
char a[] = "linux";
char b[] = "windows";
便可以了。
char *a = "linux";
char *b = "windows";
a,b是指向常量数据的指针,所指向的内容是只读的(常量字符串不能修改其值)。。
示例3:
void change1(char* name)
{
//*name='a';
name = "alter";