1. 程式人生 > >指針和數組

指針和數組

color cto 51cto 編譯器 指針變量 系統調用 和數 修飾 RoCE

指針:
 指針在本質上是一個變量;指針需要占用一定的內存空間;指針用於保存內存地址的值
*號的意義:
 在指針聲明時,*號表示所聲明的變量為指針;
 在指針使用時,*號表示取指針所指向的內存空間中的值 ;
 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語言中無法向一個函數傳遞任意的多維數組;
 為了提供正確的指針運算,必須提供除第一維之外的所有維長度限制:
  一維數組參數 – 必須提供一個標示數組結束位置的長度信息
  二維數組參數 – 不能直接傳遞給函數
  三維或更多維數組參數 – 無法使用
函數與指針分析:
技術分享圖片

指針和數組