1. 程式人生 > 其它 >指標進階詳解

指標進階詳解

技術標籤:C學習心得

字元指標

#include <stdio.h>

int main()
{

	char ch = 'a';
	char *p = &ch;

	char *p1 = "hello world!";
	const char *p1 = "hello world!";


	return 0;
}

字元指標就是指向一個char型別變數的指標。
通常我們會這樣直接引用

char *p = “abcdef”;

這時的abcdef是一個字串常量,是不可修改的值。p也僅僅是存放abcdef這個字串的首元素的地址

在這裡插入圖片描述
當解引用時,僅僅是顯示h,也就是這個字串的首元素。

另外,因為指標指向的是一個常量字串,所以我們會用const常量修飾一下,這樣會更好。

下面看看一個例題:

	char str1[] = "I like study";
	char str2[] = "I like study";

	char *str3 = "I like study";
	char *str4 = "I like study";

	if (str1 == str2)
	{
		printf("str1地址與str2地址相同。\n"
); } else { printf("str1地址與str2地址不相同。\n"); } if (str3 == str4) { printf("str3地址與str4地址相同。\n"); } else { printf("str3地址與str4地址不相同。\n"); }

在這裡插入圖片描述
由此可知,char陣列建立時,會開闢兩個不同的空間,所以地址會不同。

而char * 指向的字串是一個常量,所以指標只是在指向它,所以只開闢了一次,不同的指標在指向它、

指標陣列

指標陣列:顧名思義就是一個存放指標的陣列,這個陣列中的元素都是一個個指標(也就是地址)。

int *arr[10];

上面這個就是一個叫arr的陣列中存放了指向int 型別變數的指標,這個會和馬上介紹的陣列指

針混淆。

指標陣列本質是一個數組,因為arr變數名先和 [ ] 結合arr[]說明這是一個數組,再看前面有一
個int 所以說明arr陣列中存放的 int 型別的元素。

陣列指標

陣列指標:指標有指向字元元素的,整形元素的,而陣列指標就是指向一個數組的指標,它存放的是一個數組的地址,是不是很神奇昂呀。

#include <stdio.h>

int main()
{
	int arr[10] = { 0 };
	int(*p)[10] = &arr;

	return 0;
}

int(*p)[10] ;

這就是陣列指標的定義形式,是不是和int *p[10]很像,但是就是一對()就改變了他的性質,

因為()是先和結合,這就決定了(*p)是一個指標,去掉指標定義的部分剩下的就是int [10]這不

就是陣列嗎。所以他指向的就是包含10個int元素的陣列,而前面的指標陣列變數先和[]結

合,所以就是個陣列,是不是很草率,就是結合性優先順序的緣故,所以一個是指標,一個是

陣列。

下面在介紹一下二維陣列的真正本質

	//二維陣列的深度解析
	int     (arr2[3])      [5];
	//二維數字的陣列名為行指標
	//arr有三個元素 - 有三行
	//再往外看 - 每一行中又是一行一維陣列 - 一維陣列中有5個int型別的元素

我們要搞清楚無論什麼陣列,他的陣列名字是這個陣列的首元素的地址,一維陣列的首元素是一個變數的,但是二維陣列的首元素比較奇怪,他的首元素是第一行元素的地址,也就是一個行指標,他不是一個二級指標,他存放不是一級指標的地址,而是一個一維陣列的(一行元素)地址,所以二級指標的傳參可以用一個數組指標接收。

int main()
{
	void print(int(*p)[3], int r, int c);

	int arr[3][3] = { {1,2,3}, {2,3,4,}, {3,4,5} };
	print(arr, 3, 3);
	return 0;
}

void print(int(*p)[3], int r, int c)
{
	for (int i = 0; i < r; i++)
	{
		for (int j = 0; j < c; j++)
		{
			printf("%d ", *(*(p + i) + j));
		}
		printf("\n");
	}
}

大略的瞭解之後你看看你會不會下面的幾道題目

#include <stdio.h>
int main()
{

	int  arr[5];            //一維陣列
	int  *parr1[10];        //指標陣列
	int  (*parr2) [10];     //陣列指標
	int (* parr3[10] ) [10];//陣列指標陣列,一個存放陣列指標的陣列

	return 0;
}

如果你己經輕輕鬆鬆做對了上面的幾個題,說明你已經初步入門了,要再接再厲哦。

下面總結一下函式傳參時,一級指標和為二級指標的引數接收值應該是什麼

一級指標:
1.普通變數的地址 (&a)
2.一級指標*p中的p
3.一維陣列的陣列名

二級指標:
1.int *arr[10]這種陣列指標的陣列名(也就是他的首元素的地址,一級指標的地址)
2.int**p這種二級指標