c语言交换ab的值用scanf函数,C语言按值传递_scanf函数

C语言按值传递_scanf函数

指针做形参&局部变量以及内存分配

参考:http://www.cnblogs.com/stoneJin/archive/2011/09/21/2183962.html

看一个C程序,这个程序很好的说明了一级指针的值传递:

#include 

#include 

//指针作为形参在函数里分配内存

//这里是值传递

//实参的值没有改变,形参的值是实参的一个拷贝

void init_str(char *p){

//malloc分配的内存函数执行完成后不会被销毁,除非free掉

//而数组等局部变量,函数执行完后会被销毁

p = (char*)malloc(sizeof(char));

//要记得使用指针变量时

//每次分配空间后要判断是否分配成功。

//而且在主函数中使用之后记得释放内存,并置空

if (p == NULL)

{

printf("error memory");

return;

}

strcpy(p,"sdsdsdsdsdsd3333");

printf("%s",p);

return;

}

//指针的指针作为形参在函数里分配内存

void init_str_2(char **p){

*p = (char*)malloc(sizeof(char));

if(*p==NULL){

printf("error memory");

}

}

//函数里分配内存,返回该内存块指针

char* init_str_3(){

char *p = NULL;

p = (char*)malloc(sizeof(char));

//要记得使用指针变量时

//每次分配空间后要判断是否分配成功。而且在主函数中使用之后记得释放内存,并置空

if (p == NULL)

{

printf("error memory");

return NULL;

}else {

return p;

}

}

int main(){

char *p,*p2,*p3;

//    p=NULL;

//    init_str(p);

//    printf("%x",p);

//    strcpy(p,"1sdsdsada887asdfs"); //p还是空指针,没有被初始化

//    printf("%s",p);

//程序崩溃

p2=NULL;

init_str_2(&p2);

strcpy(p2,"pointer p2 stores value2");

printf("%s\n",p2);

p3=NULL;

p3=init_str_3();

strcpy(p3,"pointer p3 stores value3");

printf("%s\n",p3);

}

输出打印,

pointer p2 stores value2

pointer p3 stores value3

Program ended with exit code: 0

scanf函数和指针:

scanf函数的参数是一个指针,直接看程序吧:

#include 

#include 

int main(){

int *i;

//如果对此地址的内存进行写操作,是危险的

i=0x22fe50; //直接给指针变量赋一个地址值

printf("%x\n",i);  //输出i的十六进制

printf("%d\n",i);  //输出i的十进制

printf("%d\n",*i); //输出内存地址为i指向的十进制值

int f;

//编译器执行默认初始化为0

printf("%d\n",f);

int a = 2293328; //指针i的值的十进制a=2293328

//在这里a是一个整形值,不是指针,但还没有使程序崩溃

scanf("%d",a);

printf("%d\n",a); //输出的值还是a=2293328

int b = 2293328;

scanf("%d",(int*)b); //b是十进制,强制转为内存的一个地址值

printf("%d",*(int*)b); //输出输入的值

}

/*

运行结果:

和我想的是不一样的

22fe50

2293328

6649072

0

21

2293328

32

32

Process returned 2 (0x2)   execution time : 12.477 s

Press any key to continue.

*/

======END======

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值