指针c语言与数组,C语言指针与数组
C語言指針與數組
數組的下標應該從0還是1開始? 我提議的妥協方案是0.5,可惜他們未予認真考慮便一口回絕 ? ?-- Stan Kelly-Bootle
1. 數組并非指針
為什么很多人會認為指針和數組始終應該可以互換的呢? 因為對數組的引用總是可以寫成對指針的引用,而且確實存在一種指針和數組的定義完全相同的上下文環境,
不幸的是,這只是數組的一種極為普通的用法,并非所用情況下都是如此。
2. 什么是聲明,什么是定義
C語言中對象必須有且只有一個定義,但它可以有多個extern聲明.
定義:只能出現在一個地方,確定對象的類型并分配內存,用于創建新的對象,例如 int a[100]
聲明:可以多次出現,描述對象的類型,用于指代其他地方定義的對象(例如在其他文件里) 例如 extern int a[100]
extern對象聲明告訴編譯器對象的類型和名字,對象的內存分配則在別處進行
3. 數組與指針的區別
出現在賦值左邊的符號被稱為 左值, 出現在賦值右邊的符號被稱為 右值。
編譯器為每個變量分配一個地址(左值),這個地址在編譯時可知,并且該變量在運行時一直保存于這個地址中。
存儲于變量中的值(右值)只有在運行時才可知,如果需要用到變量中存儲的值,編譯器就發出指令從指定地址讀入變量并將它存于寄存器中。
例如: char a[9] = "abcdefgh"; ? c = a[i]
假設編譯器符號表具有一個地址9980
運行時步驟1:取 i 的值,將它與 9980 相加 (基址加偏移量)
運行時步驟2:取地址 [9980+i] 的內容
例如:char* p; ?c = *p;
假設編譯器符號表有一個符號p,它的地址為4624
運行時步驟1:取地址 4624 的內容,假設是 1024
運行時步驟2:取地址1024的內容
例如:char* p = "abcdefgh" ? c = p[i]
假設編譯器符號表有一個p,地址為 4624
運行時步驟1:取地址4624的內容,假設是 1024
運行時步驟2:取得 i 的值,并將它與 1024 相加 ?(基址加偏移量)
運行時步驟3:取地址 [1024+i] 的內容
指針
數組
保存數組的地址
保存數據
間接訪問數據,首先取指針的內容,把它作為地址,然后從這個地址提取數據。
如果指針有一個下標[i],就把指針的內容?加上i作為地址,從中提取數據
直接訪問數據 a[i]只是簡單的以a+i作為地址取數據
通常用于動態數據結構
通常用于存儲數目固定且數據類型相同的元素
相關的函數為 malloc free
隱式分配和刪除
通常指向匿名數據
自身即為數據名
定義指針時,編譯器沒有為指針所指向的對象分配空間,只是分配指針本身的空間
ANSI C中,初始化指針時所創建的字符串常量所定義為 只讀。在有些編譯器中,字符串常量被存放在只允許讀取的文本段中,以防止它被修改
char* ptr = "hello world" ? ?// 這種寫法是非常不推薦的,因為 ptr 所指對象是只讀的,這將隱式的將 const 轉 non-const,任何對 ptr 的修改都會 coredump
const char* ptr = "hello world" ? // 這種寫法明確表示 ptr 的const屬性,這時對 ptr 所指對象的修改都會 在編譯時報錯
char a[] = "hello world" ? ? ? ? ? ? ?//這種寫法表明 數組中元素都是可修改的,但是數組名是不可修改的左值,即數組首地址不可以改變,是常量
4. 什么時候數組與指針相同
所有作為函數參數的數組名可以通過編譯器轉換為指針
數組的聲明就是數組,指針的聲明就是指針,兩者不能混淆
注意:如果定義一個數組,在其他文件中對它extern聲明時也必須把它聲明為數組,指針也是如此
在使用數組(在語句或表達式中引用)時,數組總是可以寫成指針的形式
數組下標表達式總是可以改寫成帶偏移量的指針表達式
什么時候數組和指針是相同的:
規則1:表達式中的數組名(與聲明不同)被編譯器當作一個指向該數組第一個元素的指針 (具體見 ANSI C標準 第6.2.2.1 節)
規則2:下標總是與指針的偏移量相同(具體見ANSI C標準 第6.3.2.1 節)
規則3:在函數參數的聲明中,數組名被編譯器當作指向該數組第一個元素的指針(具體見ANSI C標準 第6.7.1 節)
其實規則1和規則1合起來理解如下:對數組下標的引用總是寫成"一個指向數組的起始地址的指針加上偏移量"
對數組的引用如a[i]在編譯時總是被編譯器改寫成*(a+i)指針訪問的形式
"作為函數參數的數組名"等同于指針
void func(int* arg);
void func(int arg[10]);
void func(int arg[]);
上述三種形式是完全等同的
5. 為什么C語言把數組形參當作指針
把作為形參的數組和指針等同起來是出于效率原因的考慮
在C語言中,所有非數組形式的數據實參均以傳值形式(對實參做一份拷貝并傳遞給調用的函數,函數不能修改作為實參的實際變量的值,而只能修改傳遞給它的那份拷貝)調用
C語言允許程序員把形參聲明為數組(程序員打算傳遞給函數的東西)或者指針(函數實際所接收到的東西)
不管程序員實際所寫的是哪種形式,函數并不自動知道指針所指數組共有多少個元素,所以必須有個約定,如數組以NULL結尾或者另一個附加的參數表示數組的范圍
可以通過向函數傳遞一個指向數組第一個元素的指針來訪問整個數組,但也可以讓指針指向任何一個元素,這樣傳遞給函數的就是從該元素之后的數組片段
C語言指針和數組知識總結(上)
C語言指針和數組知識總結(上) 一.指針的基礎 1.C語言中,變量的值能夠通過指針來改變,打印指針的語句符號可以是: ?%08x 2.指針的本質 指針的本質就是變量,那么既然是變量,那么一定會分配地址 ...
C語言指針與數組的定義與聲明易錯分析
部分摘自 1.定義為數組,聲明為指針 在文件1中定義: char a[100]; 在文件2中聲明: extern char *a; //這樣是錯誤的 這里的extern告 ...
11-C語言指針&;一維數組&;字符串
一.用指針遍歷數組元素 1.最普通的遍歷方式是用數組下標來遍歷元素 1 // 定義一個int類型的數組 2 int a[4] = {1, 2, 3, 4}; 3 4 int i; 5 for (i = ...
c語言指針,數組
指針:說簡單點就是一個地址.例如int *p,p是個變量,里面放的是地址0x0000,同理,每一個指針,不管什么類型,都是地址,也就是空間都是4個字節(32位機). 以此類推,指針也有指向它的指針in ...
C語言指針和數組
#include int main() { /********************************************* * * 指針和數組: * 定義 ...
c語言 指針與數組
關鍵概念: 1.多個不同類型的指針可以對應同一個地址: 2.(&p)則是這樣一種運算,返回一個指針,該指針的值是當時聲明p 時開辟的地址,指針的類型是p的類型對應的指針類型: 3.(*p)操作 ...
C語言指針和數組知識總結(下)
一.數組指針: 數組指針就是一個指針,只不過它指向的是一個數組.可以通過如下方式來定義 typedef int Array[5]; //數組類型 Array* m; ? ? ?//數組定義 還有一種更 ...
C語言核心之數組和指針詳解
指針 相信大家對下面的代碼不陌生: int i=2; int *p; p=&i;這是最簡單的指針應用,也是最基本的用法.再來熟悉一下什么是指針:首先指針是一個變量,它保存的并不是平常的數據,而 ...
指針與數組的區別 —— 《C語言深度剖析》讀書心得
原書很多已經寫的很清楚很精煉了,我也無謂做無意義的搬運,僅把一些基礎和一些我自己以前容易搞混的地方寫一下. 1. 意義: 指針: 指針也是一種類型,長度為4字節,其存放的內容只能是一個地址(4字節). ...
隨機推薦
Windows和linux的文件共享(1)
今天是我學習linux以來第一次寫博客.帶著一種激動心情我開始嘗試著去完成第一篇博客.從易到難.所以第一次我就主要學習了Windows之間的文件共享. Window之間的文件共享是通過局域網實現的.局 ...
android:persistent屬性
application PhoneApp既沒有被Broadcast喚醒,也沒有被其他service調用,那么是android是通過什么方式來啟動PhoneApp,所以就發現了屬性android:per ...
js中的寫出想jquery中的函數一樣調用
1.IIFE: Immediately-Invoked function Expression 函數模塊自調用 2.代碼實現
unity項目build成webgl時選擇生成目錄(解決方法)
在unity里點擊File>>Build Settings...>>勾選你要生成的Scenes>>選擇webgl>>后面Development Buil ...
docker學習系列(二):使用Dockerfile創建自己的鏡像
dockerfile可以允許我們自己創建鏡像,通過編寫里面的下載軟件命令,執行docker build 即可生成鏡像文件. 初嘗dockerfile 新建一個目錄test,然后進入這個目錄,創建一個名 ...
主引導記錄MBR的結構和作用
MBR磁盤分區都有一個引導扇區,稱為主引導記錄,英文簡稱為MBR.1.?MBR的結構MBR扇區位于整個硬盤的第一個扇區:按照C/H/S地址描述,即0柱面〇磁頭1扇 區:按照LBA地址描述即0扇區.它是 ...
Scrum Meeting 5 -2014.11.11
放假過掉一大半.大家都努力趕著進度,算法實現基本完成.可能還有些細小的改動,但也可以統一進入測試階段了. 今天叫了部分在校人員開了個小會.任務決定以測試為主,同時開始進行服務器的部署. 在之前嘗試服務 ...
vue組件中,iview的modal組件爬坑--modal的顯示與否應該是使用v-show
這是我第一次寫博客,主要是記錄下自己解決問題的過程和知識的總結,如有不對的地方歡迎指出來! 需求:點擊btn,彈出modal顯示圖表(以折現圖為例) 這應該是很基本的需求也是很容易實現的,代碼和效果如 ...
關于Android不同系統版本的市場占比情況詳解
一,google官方統計的不同Android版本市場的占比強開 google統計的數據情況 這個是google官方對于不同版本的市場占比情況.這個是針對全世界所有的Android手機占比情況. 二,友 ...
總結
以上是生活随笔為你收集整理的指针c语言与数组,C语言指针与数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 极密宝、Lastpass、1passwo
- 下一篇: rizomuv缩放排布_Unfold 3