指針和數組
指針在本質上是一個變量;指針需要占用一定的內存空間;指針用於保存內存地址的值
*號的意義:
在指針聲明時,*號表示所聲明的變量為指針;
在指針使用時,*號表示取指針所指向的內存空間中的值 ;
char *p <==> (char *)p //前面的數據類型是修飾指針指向的空間大小,在32位機器中,指針大小為4字節
傳值調用與傳址調用:
指針是變量,因此可以聲明指針參數
當一個函數體內部需要改變實參的值,則需要使用指針參數
函數調用時實參值將復制到形參
指針適用於復雜數據類型作為參數的函數中
數組:
相同類型的變量的有序集合
數組的大小:數組在一片連續的內存空間中存儲元素,數組元素的個數可以顯示或隱式指定
Int a[5] = {1,2};
Int b[] = {1,2};
數組地址與數組名:
數組名代表數組首元素的地址(a);
數組的地址需要用取地址符&才能得到(&a);
數組首元素的地址值與數組的地址值相同
數組首元素的地址與數組的地址是兩個不同的概念
數組名的盲點:
數組名可以看做一個常量指針;
數組名“指向”的是內存中數組首元素的起始位置;
在表達式中數組名只能作為右值使用下
數組名作為sizeof操作符的參數;數組名作為&運算符的參數
變量 | 含義 |
---|---|
a | a為數組首元素的地址;a + 1 <==>(unsigned int)a + sizeof(*a) |
&a | &a為整個數組的地址; &a + 1 <==>(unsigned int)(&a) + sizeof(*&a) |
數組與指針分析 :
數組的本質:
數組是一段連續的內存空間;
空間大小為sizeof(array_type)* array_size;
指針的運算 :
數組的訪問形式:
數組參數:
數組作為函數參數時,編譯器將其編譯成對應的指針;
一般情況下,當定義的函數中有數組參數時,需要定義另一個參數來標示數組的大小
void f(int a[]); ==>void f(int* a);
void f(int a[5]); ==>void f(int* a);
指針和數組的對比:
C語言中的字符串:
指針數組和數組指針分析:
定義數組類型:
main函數的參數:
main函數可以理解為操作系統調用的函數;在執行程序的時候可以向main函數傳遞參數
多維數組和多維指針:
指向指針的指針:
指針變量在內存中會占用一定的空間;可以定義指針來保存指針變量的地址值
二維數組與二級指針:
數組參數和指針參數分析:
C語言中的數組參數會退化為指針:
二維數組參數:
c語言中無法向一個函數傳遞任意的多維數組;
為了提供正確的指針運算,必須提供除第一維之外的所有維長度限制:
一維數組參數 – 必須提供一個標示數組結束位置的長度信息
二維數組參數 – 不能直接傳遞給函數
三維或更多維數組參數 – 無法使用
函數與指針分析:
指針和數組