1. 程式人生 > >C語言指標知識點(二):指標在函式的輸入、輸出時 的性質

C語言指標知識點(二):指標在函式的輸入、輸出時 的性質

  1. 主調函式可以把棧區、堆區、全域性區的資料地址傳給被調函式;被調函式只能返回堆區和全域性區的資料及地址。
  2. 指標作為函式的傳入引數,由主調函式分配記憶體;指標作為函式的輸出時,由被調函式分配記憶體。
  3. 如果想通過形參改變實參的內容,必須地址傳遞(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;
}