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;
}
因此,我通過將數組和指針聯繫在一起來更通俗的理解二級指針,但是二級指針不僅僅是這種關係,二級指針也是一種對指針的更深入的利用,將常量換成指針量,對指針進行取地址。因此,給大家開個頭,接下來大家有興趣的可以繼續鑽研。
最後,如果這篇文章中有些不正確的地方,歡迎大家批評指正。也可以留言與我共同探討二級指針的應用。