1.void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
请问运行Test函数会有什么样的结果?
答:
这个是形参改变实参的问题:可以有两种方法解决
形参改变影响实参主要应用在以下两个方面:
1.用于外部函数要交换主函数中的两个值,可以用指针来实现,但通过指针来实现主函数中两个数的交换必须要知道,哪些类型属于值传递,哪些类型属于地址传递,对于值传递的那些类型(例如:整形、字符型)才有必要用指针来实现,因为数组,字符串属于地址传递类型,所以没必要在外部函数通过用指针来实现主函数中的两个数的交换。举例:
2.在开辟空间的时候使用二级指针来实现主函数中指针内存的开辟,不然如果不用二级指针的话就必须在外部开辟空间的函数有一个返回值类型,然后赋值给主函数中的指针,如果不通过这两种方法实现的话就可能引发内存问题,举例:
方法 一、通过在外部开辟空间的函数里有返回指针类型,然后赋值给主函数中的指针的方法,来实现主函数中指针空间的开辟
方法二、通过二级指针来实现对主函数中指针的赋值,所谓二级指针就是指向指针的地址
2.char *GetMemory(void)
{
char p[] = "hello world"; //“hello world存储在静态区域,访问权限就局限在函数内部,生命周期随着函数的终止而终止”
//char *p="hello world"; //存储在静态去,生命周期随着程序的终止而结束,所以外部可以打印出这段“hello world”
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
请问运行Test函数会有什么样的结果?
答:
3.Void GetMemory2(char **p, int num) //二重地址就是取指针的地址
{
*p = (char *)malloc(num); //这里的*p也就是str,相当于str=(char *)malloc(num);其实已经向Test中str开辟空间了
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
请问运行Test函数会有什么样的结果?
答:hello
4.void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
请问运行Test函数会有什么样的结果?
答:world
5.用#define定义一个宏MAX,取得整形a和b中的比较大数的值
//
// main.c
// 2013-5-11作业5
//
// Created by 丁小未 on 13-7-11.
// Copyright (c) 2013年 dingxiaowei. All rights reserved.
//
#include <stdio.h>
#define max(a,b) (a>b?:a,b)
//#define Max(a,b) a>b
int maxValue(int a,int b)
{
//方法一:
// if (Max((a), (b))) { //注意:非常有必要对a,b加上括号,正对那种Max(a*c,b) 这里有符号的优先级问题,如果比>要低,那么就会有问题
// return a;
// }
// else
// return b;
//方法二:
return max((a),( b));
}
int main(int argc, const char * argv[])
{
int maxNum=maxValue(10, 11);
printf("%d",maxNum);
return 0;
}
6.使用多个文件编译项目程序,文件a中定义用递归方法计算1+3+5。。。。97+99的函数int funA(int iNum),文件b中定义用指针方法排序如意从控制台输入的10个数字,函数为int *funB(int *pNum),文件mian.c调取文件a和b的函数,并输出结果