数组名与数组指针的关系
生活随笔
收集整理的這篇文章主要介紹了
数组名与数组指针的关系
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一個奇怪的現象
#include<stdio.h>int main(void) {int arr[5] = { 1,2,3,4,5 };int(*p)[5] = &arr;printf("%p\n", p); //運行后會發現這二者數值上相等printf("%p\n", *p);return 0; }一個奇怪的二級指針
#include<stdio.h>int main(void) {int arr[5] = { 1,2,3,4,5 };int(*p)[5] = &arr;//程序成功運行,且結果都為:1printf("%d\n", **p); //我們可以知道p=&arrprintf("%d\n", **&arr); //二者都是二級指針return 0; }一個奇怪的解釋
? ? ? 奇怪問題的某個解釋
? ? ? 指向數組的指針,設計者為了和指向元素的指針區分開來做了這樣的設計:單純的數組名就表示一個指向數組首元素的指針,其需要開辟一個單獨的空間存放,同時數組名空間內的值不可變。如果要表示整個數組的地址的話,就在單純的數組名之上,提高了一下等級,變為二級指針,但不單獨給空間。
? ? ? ?設計一個規則,當對數組名取地址,就是對一級指針取地址。需要一個變量存放它,需要一塊空間,這樣就是一個正常的二級指針,但在這里不單獨給空間,就把數組名(一級指針)占的空間作為它的空間,同時提高它的等級,變為二級指針,給這種指針標記(特殊的二級指針),搞出一個類型來標記/表示它:type(*)[]。如果要對這種二級指針進行解引用時,就只降低它的等級,變為正常的一級指針
? ? ? ? //這些只是假設,為了解決*p=p的問題參考資料想出的一個可以說服自己的解釋。理解后可以不管這些,將這個作為一種新的類型去理解即可。一個值為和一級相同的指針類型,不過加了一個二級指針的特性。依舊需要分配空間(也可以和數組一樣理解空間分配,將&arr傳遞過去之后,系統根據類型分配了一塊空間)。
總結:數組名是一個指針常量,&數組名就是是對一級指針取地址,一個二級指針,但賦給了它一個特殊規則。
一些正常的應用
按照我的理解,&arr是一個特殊的二級指針,類型為type(*)[ ]。
#include<stdio.h>int main(void) {int arr[5] = { 1,2,3,4,5 };int(*p)[5]; //定義一個該類型指針變量p= &arr; //把該類型的值給它printf("%d\n",(*p)[1]); //*p使其變為普通一級指針:arrprintf("%d\n", arr[1]); //arr:指向數組首元素的指針printf("%d\n", *(*p + 1)); printf("%d\n", *(*(&arr) + 1)); //p=&arrprintf("%d\n", *(arr + 1)); //*p=arrprintf("%d\n", arr[1]);//結果均為:2//這樣是不是就好理解多了return 0; }總結
以上是生活随笔為你收集整理的数组名与数组指针的关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 指针-字符指针
- 下一篇: 指针-数组传参,指针传参