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======