一日不見,如隔三秋。思念如水流,時間越久越長;想你的心情如潮水,波濤洶涌澎湃!
想我了嗎,朋友們,今天又是學習的一天
1,二級指針
我們知道一級指針,可以用來存放我們數據類型變量的地址,竟然我們已經有了一級指針,然後一級指針必然在空間中也有地址。
(^_−)☆我們如何去存放一級指針的地址呢?
這時候我們就要學習我們的二級指針,
我們看下面的那個代碼。~(^◇^)/
#include <stdio.h>
int main()
{
int a = 0;
int* p = &a;
printf("%p\n", p);
int** pp = &p;
printf("%p\n", pp);
}
在上面的代碼中p是指針變量是屬於一級指針,他的類型是int*,而對於上面代碼中的PP也是指針變量,但是他的類型是int **
他的對象指向是int * ~(з)-☆
同理我們也能作出三級指針
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
int* p = &a;
printf("%p\n", p);
int** pp = &p;
printf("%p\n", pp);
int*** ppp = &pp;
printf("%p\n", ppp);
}
2,指針數組
理解;當我們第一次看到指針數組,是否在心中有疑問指針數組是數組還是指針,舉個例子整形數組是整型還是數組,毫無疑問是數組,所以指針數組是數組,
int arr[10]
上面的是整形數組,存放的每個元素是整形
char arr[10]
上面的是字符數組,存放的每個元素是整形,字符有AISS表,他們是有對應的數字的
int* arr4[3] = { arr,arr2,arr3 }; //
整形指針數組
所以指針數組裏面都是指針,帥哥美女明白了嗎?像int * arr[]
接下來我們去實現模擬二維數組來認識一下組指數組(模仿的是效果)
二維數組;每行是一個一維數組
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5 };
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 };
int* arr4[3] = { arr,arr2,arr3 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
printf("%d ", arr4[i][j]);
}
printf("\n");
}
return 0;
}
我們來了解一下這個模擬的數組,首先我們將拿到的第一個數組的地址arr[0],
在int * arr4[]={arr,arr2,arr3}中其實arr4是數組,所以數組是有下標的當我們拿到下標是0的元素時,我們就拿到了arrd的數組的內容也就是,arr數組的首元素的地址,我們將他打印下來;
arr4[0][j] int arr -------------------> (這裏地址)1,2,3,4,5
arr4[1][j] int arr2 -------------------> (這裏地址)2,3,4,5,6
arr4[2][j] int arr3 -------------------> (這裏地址)3,4,5,6,7
像上次的組指文章中我介紹過arr[i]==*(arr+i),所以這裏arr4[i][j]==*(*(arr+i)+j);
3,字符指針變量
在指針的類型中我們知道有⼀種指針類型為字符指針 char*
int main()
{
char ch = 'w';
char *pc = &ch;
*pc = 'w';
return 0;
}
還有⼀種使⽤⽅式如下:
int main()
{
const char* pstr = "hello";//
這⾥是把⼀個字符串放到
pstr
指針變量⾥了嗎?
printf("%s\n", pstr);
return 0;
}
代碼 const char* pstr = "hello"; 特別容易讓我們以為是把字符串 hello放到字符指針 pstr ⾥了,但是本質是把字符串 hello,⾸字符的地址放到了pstr中。上⾯代碼的意思是把⼀個常量字符串的⾸字符 h 的地址存放到指針變量 pstr 中。
關於上面的代碼我們可以使用有趣的方式去了解例如
int main()
{
char* p = "asdfgh";
printf("%c\n", *p);
return 0;
}
或者這樣打印
int main()
{
char* p = "asdfgh"; //
是常量字符串,不能修改,最好加個
const
printf("%c\n", "asdfgh"[3]); //
這裏
p[3]
也是一樣的,盆友
return 0;
}
y也可以全部打印
int main()
{
char* p = "asdfgh";
int i = 0;
for (i = 0; i <= 6; i++)
{
// printf("%c\n", "asdfgh"[i]);
printf("%c\n", *(p+i));
}
return 0;
}
這樣我們就可以將“asdfgh”像想成一個數組,這樣只是用來理解的不要將“asdfgh”當成有個數組
接下來我們來見識一下一道筆試題目
#include <stdio.h>
int main()
{
char str1[] = "hello bit.";
char str2[] = "hello bit.";
const char *str3 = "hello bit.";
const char *str4 = "hello bit.";
if(str1 ==str2)
printf("str1 and str2 are same\n");
else
printf("str1 and str2 are not same\n");
if(str3 ==str4)
printf("str3 and str4 are same\n");
else
printf("str3 and str4 are not same\n");
return 0;
}
我們可以使用這樣的方式去認識,是否相同就像str1和str2是數組,數組是可以修改的
常量字符串是不能修改的。
4,數組指針變量
之前我們學習了指針數組,指針數組是⼀種數組,數組中存放的是地址(指針)。
數組指針變量是指針變量?還是數組?答案是:指針變量。我們已經熟悉:
• 整形指針變量: int * pint; 存放的是整形變量的地址,能夠指向整形數據的指針。
• 浮點型指針變量: float * pf; 存放浮點型變量的地址,能夠指向浮點型數據的指針。
那數組指針變量應該是:存放的應該是數組的地址,能夠指向數組的指針變量
我們可以看一下代碼
int main()
{
int a = 10;
int* pa = &a;
char b = 'w';
char pb = &b;
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int(*parr)[10] //
這個是數組指針
return 0;
}
我們來判斷一下下⾯代碼哪個是數組指針變量?
int *p1[10];
int (*p2)[10];
先看p1;首先當我們的p1與【】在一起時先和【】結合,所以p1[10]是數組,然後加上*就構成了我們的指針數組
其這次p2;為了防止p2與【】在一起時先和【】結合,我們將使用()將p2和【】隔開;所以p2不是指針數組
P1是數組,數組有10個元素,每個元素的類型是int*
P2是指針,指針指向的是數組,數組有10個元素,每個元素的類型是int,p2是數組指針
int (*p) [10] = &arr;
| | |
| | |
| | p
指向數組的元素個數
| p
是數組指針變量名
p
指向的數組的元素類型
我們可以所以數組指針去打印數組的內容,但是在這裏我們要説不建議這樣去完成;
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int se = sizeof(arr) / sizeof(arr[0]);
int i = 0;
int(*p)[10] = &arr;
for (i = 0; i < se; i++)
{
printf("%d ", (*p)[i]);
}
}
5,⼆維數組傳參的本質
有了數組指針的理解,我們就能夠講⼀下⼆維數組傳參的本質了。
過去我們有⼀個⼆維數組的需要傳參給⼀個函數的時候,我們是這樣寫的:
先來個⼆維數組的傳參(平常)
void print(int arr[3][5], int x, int y)
{
int i = 0;
for (i = 0; i < x; i++)
{
int j = 0;
for (j = 0; j < y; j++)
{
printf("%d", arr[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[3][5] = { {1,2,3,4,5} ,{2,3,4,5,6}, {3,4,5,6,7} };
print(arr,3,5);
return 0;
}
這⾥實參是⼆維數組,形參也寫成⼆維數組的形式,那還有什麼其他的寫法嗎?
⾸先我們再次理解⼀下⼆維數組,⼆維數組起始可以看做是每個元素是⼀維數組的數組,也就是⼆維數組的每個元素是⼀個⼀維數組。那麼⼆維數組的⾸元素就是第⼀⾏
所以,根據數組名是數組⾸元素的地址這個規則,⼆維數組的數組名錶⽰的就是第⼀⾏的地址,是⼀
維數組的地址那就意味着⼆維數組傳參本質上也是傳遞了地址,傳遞的是第⼀
⾏這個⼀維數組的地址,那麼形參也是可以寫成指針形式的。如下
接下來我們使用數組指針來一個
void print(int (*arr)[5], int x, int y)
{
int i = 0;
for (i = 0; i < x; i++)
{
int j = 0;
for (j = 0; j < ; j++)
{
printf("%d",*(*(arr+i)+j));
}
printf("\n");
}
}
int main()
{
int arr[3][5] = { {1,2,3,4,5} ,{2,3,4,5,6}, {3,4,5,6,7} };
print(arr,3,5);
return 0;
}
總結:⼆維數組傳參,形參的部分可以寫成數組,也可以寫成指針形式