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.用于外部函數要交換主函數中的兩個值,可以用指針來實作,但通過指針來實作主函數中兩個數的交換必須要知道,哪些類型屬于值傳遞,哪些類型屬于位址傳遞,對于值傳遞的那些類型(例如:整形、字元型)才有必要用指針來實作,因為數組,字元串屬于位址傳遞類型,是以沒必要在外部函數通過用指針來實作主函數中的兩個數的交換。舉例:
<a target="_blank"></a>
2.在開辟空間的時候使用二級指針來實作主函數中指針記憶體的開辟,不然如果不用二級指針的話就必須在外部開辟空間的函數有一個傳回值類型,然後指派給主函數中的指針,如果不通過這兩種方法實作的話就可能引發記憶體問題,舉例:
方法 一、通過在外部開辟空間的函數裡有傳回指針類型,然後指派給主函數中的指針的方法,來實作主函數中指針空間的開辟
方法二、通過二級指針來實作對主函數中指針的指派,所謂二級指針就是指向指針的位址
2.char *GetMemory(void)
{
char p[] = "hello world"; //“hello world存儲在靜态區域,通路權限就局限在函數内部,生命周期随着函數的終止而終止”
//char *p="hello world"; //存儲在靜态去,生命周期随着程式的終止而結束,是以外部可以列印出這段“hello world”
return p;
str = GetMemory();
3.Void GetMemory2(char **p, int num) //二重位址就是取指針的位址
*p = (char *)malloc(num); //這裡的*p也就是str,相當于str=(char *)malloc(num);其實已經向Test中str開辟空間了
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
答:hello
4.void Test(void)
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
答: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的函數,并輸出結果
本文轉蓬萊仙羽51CTO部落格,原文連結:http://blog.51cto.com/dingxiaowei/1366566,如需轉載請自行聯系原作者