**
C语言出参处理及常量指针(指向常量的指针)指向的改变:
**
1、C语言中的函数出参与面向对象语言不同,普通变量(非指针)入参时要降为指针,取其地址传入函数修改其值。
#include <string.h>
#include <stdio.h>
#include <ctype.h>
void setintvalue(int *p_x)
{
*p_x = 20;
printf("未调用setx2时 x:%d\n",*p_x);
setx2(&p_x);
}
int main()
{
int x = 10;
setintvalue(&x);
printf("main: | x:%d\n",x);
return 0;
}
/*
setstr: | str1:global | str2:global
main: | str1:global | str2:right | p:aello
未调用setx2时 x:20
setx2:30
main: | x:30
*/
2、常量指针(指向常量)改变指向(从而改变内容)的方法
2.1、异域(传入某函数作为出参时)可使用其二级指针改变其指向:
void sety(const int ** y)
{
int a =1;
(*y)=&a;
}
void set_str(const char **str1,const char *str2)
{
*str1 = "global";
str2 = "global";
printf("setstr: | str1:%s | str2:%s \n", *str1,str2);
}
void main (void)
{
int x =10;
const int *y = &x;
sety(&y);
printf("y里值:%d\n,y地址:%#x",*y,y);
char a[6]="hello";
const char *str1 = "left";
const char *str2 = "right";
char* const p = a;
a[0] = 'a';
//*p = 'b'; //也可修改成功
set_str(&str1,str2);
printf("main: | str1:%s | str2:%s | p:%s \n", str1,str2,p);
}
/*
y里值:1
,y地址:0xd01f1eec
setstr: | str1:global | str2:global
main: | str1:global | str2:right | p:aello
*/
2.2 同区域直接改变指向
void main (void)
{
int x =10;
int b = 100;
const int *y = &x;
y = &b;
printf("y里值:%d\n,y地址:%#x",*y,y);
}
3、普通一级指针需要作为出参时
要么降级、要么直接*p = …;来改变其值
int d =1000;
int *c = &d;//全局量
void setcom(int *y)
{
int b =1000;
// y=&b; //不可行,y出去后,内容还是旧值
//y = c; //不可行
*y = *(c);//可行
//*y = d; //可行
//*y=1000;//可行
}
void setcom2(int **y)
{
int b =10000;
*y=&b;
}
void main (void)
{
int x =10;
int *y = &x;
setcom(y);
printf("setcom:y里值:%d\n,y地址:%#x\n",*y,y);
setcom2(&y);
printf("setcom2:y里值:%d\n,y地址:%#x\n",*y,y);
}