指標進階詳解
技術標籤: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這種二級指標