1. 程式人生 > >C語言指標作為函式引數傳遞學習(一)

C語言指標作為函式引數傳遞學習(一)

1. 一維指標做函式引數

傳入的指標為NULL

比如下面的例子,很多人都會理解錯:

#include <stdio.h>

void test(char *string)
{
	string = "hello world";
}
int main()
{
	char *str = NULL;
	test(str);
	printf("str=%s\n",str);
	
	return 0;
	
}

是不是覺得輸出應該是:str=hello world.事實上並不是
輸出結果是(作業系統:win10):
在這裡插入圖片描述
具體過程如下:
在這裡插入圖片描述
開始str指標指向NULL,並將該地址作為形參傳入函式test(),最開始string指標也是指向NULL,接著講“hello world”地址傳給了string,此時string的指標不再指向NULL,而是指向“hello world”這個字串的地址。為了驗證這個,可以在程式碼里加一些列印資訊驗證:

#include <stdio.h>

void test(char *string)
{
	printf("string未操作之前的的指標:%p\n",string);
	string = "hello world";
	printf("string未操作之後的的指標:%p\n",string);
}
int main()
{
	char *str = NULL;
	printf("傳入test函式之前str的指標:%p\n",str);
	test(str);
	printf("str=%s\n",str);

	getchar();
	return 0;
	
}

結果:
在這裡插入圖片描述

2.那要實現在test函式中改變str的指標指向地址怎麼辦?

2.1 返回string指標,這個很好理解

#include <stdio.h>

char *test(char *string)
{
	string = "hello world";
	return string;
}
int main()
{
	char *str = NULL;
	str = test(str);
	printf("str=%s\n",str);

	getchar();
	return 0;
}

結果:
在這裡插入圖片描述
2.2 用二維指標

#include <stdio.h>

void test(char **string)
{
	*string = "hello world";
}
int main()
{
	char *str = NULL;
	test(&str);
	printf("str=%s\n",str);

	getchar();
	return 0;
}

結果:
在這裡插入圖片描述
具體分析如下圖:
在這裡插入圖片描述
過程:
1.定義一個字串指標str,str本身的地址是100,值為0(即NULL,一般的編譯器NULL的地址是0)。
2.取str的地址100傳給string,此時string的值是100,地址為200
3.這裡假設“hello world”字串的地址是300,接下來就是改變一級指標指向的內容的地址,由0變成300。