C語言指標知識點(二):指標在函式的輸入、輸出時 的性質
阿新 • • 發佈:2018-12-13
- 主調函式可以把棧區、堆區、全域性區的資料地址傳給被調函式;被調函式只能返回堆區和全域性區的資料及地址。
- 指標作為函式的傳入引數,由主調函式分配記憶體;指標作為函式的輸出時,由被調函式分配記憶體。
- 如果想通過形參改變實參的內容,必須地址傳遞(C中,C++中還可以通過引用的方式)。
#include "stdafx.h" #include <iostream> void fun1(char * s) { strcpy_s(s,sizeof("lemon1"), "lemon1");//給指標所指區域拷貝字串常量 } void fun2(char * s) { //strcpy_s(s, sizeof("lemon2"), "lemon2");//給指標所指區域拷貝字串常量, //但主調函式未分配記憶體,出錯 } void fun3(char **s, int *n) { char *p = (char *)malloc(50);//定義一個指標p,指向堆區,分配其50位元組大小 strcpy_s(p, sizeof("lemon3"), "lemon3");////給指標p所指區域拷貝字串常量 *s = p;//將指標p的地址值賦給形參,改變的是實參的值 *n = strlen(p);//將長度值賦給形參所指向位置,改變實參的值 } char * fun4() { char *p = "lemon4";//常量區字串地址賦給p return p;//返回p的值(地址值) } int main() { system("color 02"); //1.主調函式分配指標指向的記憶體,傳入被調函式 char str1[50] = { 0 };//定義一個字元陣列,即字串 fun1(str1);//呼叫函式,傳入指標 printf("str1:%s\n", str1);//輸出字串 //2.主調函式未分配指標指向的記憶體,傳入被調函式,結果出錯 char *str2 = NULL;//定義一個指標,並初始化,但未分配記憶體 fun2(str2);//呼叫函式,傳入指標 if (str2 != NULL) { printf("str2:%s\n", str2); } //3.主調函式定義指標,傳入被調函式,被調函式分配記憶體並輸出 char *str3 = NULL;//定義一個指標,並初始化,但未分配記憶體 int len = 0;//定義字串長度,初始化為0 fun3(&str3,&len);//呼叫函式,傳入指標 if (str3 != NULL) { printf("str3:%s\tlen:%d\n", str3,len);//輸出字串 } //4.將2做點修改,主調函式未分配指標指向的記憶體,傳入被調函式, //被調函式分配記憶體,返回指標 char *str4 = NULL;//定義一個指標,並初始化,但未分配記憶體 str4=fun4();//呼叫函式,函式返回值(地址)賦給str4 if (str4 != NULL) { printf("str4:%s\n", str4);//輸出字串 } printf("\n"); system("pause"); return 0; }