C/C++二級指針的理解與應用

C/C++中指針是非常重要的,在前面我幫助大家系統的認識了下指針,但是在實際開發中僅僅依靠這些指針知識是遠遠不夠的,這篇文章就帶大家來了解了解二級指針的用法以及對其的認識。接下來在這段代碼來了解了解二級指針。

void printArray(int **arr,int len)
{
	for (int i = 0; i < len; ++i)
	{
		printf("%d ",*arr[i]);
	}
}

在這裏先給大家介紹一下數組指針和指針數組。
指針數組就是一個數組中存儲的爲指針變量或者指針常量。例如下面這段代碼:

	int p = 1, q = 2;
	int *m = &p;
	int *n = &q;
	int a[2] = { *m,*n };
	cout << a[0] << "," << a[1] << endl;	//1,2
	return 0;

a這個數組中存儲的爲指針常量,因此叫指針數組。還有另一種爲數組指針,顧名思義,是指針類型的數組。例如下面的代碼:

	int test1[3] = { 1,2,3 };
	int test2[4] = { 5,6,7,8 };
	int *p[2] = { &test1[2],&test2[3] };
	cout << **p << endl;
	//先定義數組類型,在定義數組指針類型
	int a[5] = { 1,4,7,99,67 };
	typedef int(ARRAY_TYPE)[5];
	ARRAY_TYPE myarray;
	for (int i = 0; i < 5; i++)
	{
		myarray[i] = 100 + i;
	}
	for (int i = 0; i < 5; i++)
	{
		cout << myarray[i] << ",";
	}
	//對數組名取地址則代表獲得指向整個數組的指針
	ARRAY_TYPE *p_aray = &myarray;	//獲得指向myarray首元素的指針,因此可以取到數組的每一個元素
	printf("*(*p_array + 1) = %d", *(*p_aray + 1));
	p_aray = &a;
	printf("*(*p_array + 1) = %d", *(*p_aray + 1));
	typedef int(*ARR_PIONEER)[5];	//直接定義數組指針類型
	ARR_PIONEER pioneer = &a;
	int(*pioneerarr)[5] = &a;
	printf("\n");
	cout << *(a+1) << endl;
	cout << **pioneer << endl;
	cout << *(*pioneerarr + 1) << endl;

這段代碼即爲指針類型的數組,即爲數組指針。p爲儲存兩個指針的數組,在這裏可以將數組看作是具有連續地址的指針。因此這兩個指針爲test1[2]和test2[3]這兩個指針。因此對p採用兩個解引用可以得到3.這裏對p一級解引用得到*p的第一個元素,即爲test1[2]的地址,再對其解引用就可以得到test1[2]指向的值,即爲3.
那麼問題來了,如何更通俗的理解二級指針,在這裏我提供一種思路,即將二級指針看作是數組指針,即第二次解引用看作是取出數組指向的值,第一次解引用看作是取出該指針指向的地址。總體來說是獲得指針指向的數組的值。這便是二級指針理解的一種思路。接下來通過一些練習來更深入的瞭解二級指針。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//獲得文件行數
int getFileLines(FILE *file)
{

	if (NULL == file)
	{
		return -1;
	}

	char buf[1024] = { 0 };

	int lines = 0;

	while (fgets(buf, 1024, file) != NULL)
	{
		++lines;
	}

	//恢復文件指針指向文件起始位置
	fseek(file,0,SEEK_SET);



	return lines;
}


//讀取文件數據
void readFileData(FILE *file, int lines, char ** contents)
{
	if (NULL == file)
	{
		return;
	}

	if (NULL == contents)
	{
		return;
	}

	if (lines <= 0)
	{
		return;
	}

	//創建緩衝區
	char buf[1024] = { 0 };
	int index = 0;
	while (fgets(buf,1024,file) != NULL)
	{
		//printf("buf:%s", buf);
		int curLineLen = strlen(buf) + 1;
		//給當前行分配內存
		char *lineContent = malloc(sizeof(char)* curLineLen);
		//將行數據拷貝到空間中
		strcpy(lineContent, buf);

		contents[index++] = lineContent;

		memset(buf, 0, 1024);
	}

}

void showFileContents(char **contents,int lines)
{
	for (int i = 0; i < lines; ++i)
	{
		printf("%d行:%s",i + 1,contents[i]);
	}
}

//釋放文件數據內存
void freeFileSpace(char **contents, int lines)
{
	for (int i = 0; i < lines; ++i)
	{
		if (contents[i] != NULL)
		{
			free(contents[i]);
			contents[i] = NULL;
		}
	}

	free(contents);
	contents = NULL;
}

void test()
{
	
	//打開文件
	FILE *file = fopen("./text.txt","r");
	if (NULL == file)
	{
		printf("打開文件失敗!\n");
		return;
	}

	//統計文件行數
	int lines = 10;
	lines = getFileLines(file);
	printf("lines:%d\n", lines);

	char **pContents = malloc(sizeof(char *)* lines);

	//讀取文件內容
	readFileData(file, lines, pContents);

	//關閉文件
	fclose(file);
	file = NULL;

	//打印文件內容
	showFileContents(pContents, lines);

	//釋放文件數據
	freeFileSpace(pContents, lines);
}


int main(){

	test();

	system("pause");
	return EXIT_SUCCESS;
}

因此,我通過將數組和指針聯繫在一起來更通俗的理解二級指針,但是二級指針不僅僅是這種關係,二級指針也是一種對指針的更深入的利用,將常量換成指針量,對指針進行取地址。因此,給大家開個頭,接下來大家有興趣的可以繼續鑽研。

最後,如果這篇文章中有些不正確的地方,歡迎大家批評指正。也可以留言與我共同探討二級指針的應用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章