1. 程式人生 > >C語言指標知識整理

C語言指標知識整理

指標(Pointer)就是記憶體的地址,C語言允許用一個變數來存放指標,這種變數稱為指標變數。指標變數可以存放基本型別資料的地址,也可以存放陣列、函式以及其他指標變數的地址。

程式在執行過程中需要的是資料和指令的地址,變數名、函式名、字串名和陣列名在本質上是一樣的,它們都是地址的助記符:在編寫程式碼的過程中,我們認為變數名錶示的是資料本身,而函式名、字串名和陣列名錶示的是程式碼塊或資料塊的首地址;程式被編譯和連結後,這些名字都會消失,取而代之的是它們對應的地址。

1.NULL指標

1).NULL指標是一個特殊的指標變數,表示不指向任何東西,它可以賦值給一個指標,用於表示那個指標不指向任何值。對一個NULL指標進行解引用操作是非法的,引起的後果因編譯器而異,兩個常見的後果分別是返回記憶體位置零的值和終止程式。

2).在使用指標變數之前,需要對其顯示的初始化,如果知道指標將被初始化為什麼地址,就將他初初始化為什麼地址,否則將其初始化為NULL。在大多數的作業系統上,程式不允許訪問地址為 0 的記憶體,因為該記憶體是作業系統保留的。然而,記憶體地址 0 有特別重要的意義,它表明該指標不指向一個可訪問的記憶體位置。但按照慣例,如果指標包含空值(零值),則假定它不指向任何東西。 

3).通過ptr == NULL,檢查一個指標是否為空。

2.指標變數作為函式引數

陣列是一系列資料的集合,C語言不允許直接傳遞陣列的所有元素到函式內部,如果希望在函式內部運算元組,必須傳遞陣列指標。
引數的傳遞本質上是一次賦值的過程,賦值就是對記憶體進行拷貝。所謂記憶體拷貝,是指將一塊記憶體上的資料複製到另一塊記憶體上。對於像 int、float、char 等基本型別的資料,它們佔用的記憶體往往只有幾個位元組,對它們進行記憶體拷貝非常快速。而陣列是一系列資料的集合,資料的數量沒有限制,可能很少,也可能成千上萬,對它們進行記憶體拷貝有可能是一個漫長的過程,會嚴重拖慢程式的效率,為了防止技藝不佳的程式設計師寫出低效的程式碼,C語言沒有從語法上支援資料集合的直接賦值。

3.指標作為函式返回值

C語言允許函式的返回值是一個指標(地址),我們將這樣的函式稱為指標函式。

不能將一個棧變數地址通過函式返回值返回;棧變數包括函式內部定義的區域性變數和函式引數。具體原因涉及到C語言記憶體管理機制,棧變數在函式執行結束後會由系統自行收回,此時返回棧變數的地址可能會指向一個意想不到的值,該情況一般不會引起程式報錯,實際中比較難定位問題,因此使用時要細心;

可以通過函式返回堆地址,堆地址要用free函式手動釋放申請的記憶體,不然有可能發生記憶體洩露;當動態分配的記憶體不在使用時, 它應給被釋放,這樣以後可以重新使用記憶體。分配記憶體但是在使用完畢之後不進行釋放將會引起記憶體洩露。記憶體洩漏並非指記憶體在物理上的消失,而是應用程式分配某段記憶體後,由於設計錯誤,導致在釋放該段記憶體之前就失去了對該段記憶體的控制,從而造成了記憶體的浪費。

可以通過函式返回值返回靜態區/全域性區變數地址,因為在程式執行過程中靜態區/全域性區變數是一直存在的。

4.函式指標

函式和陣列一樣,都是佔用記憶體中一段連續區域,陣列名、字串名、函式名在使用時都會指向佔用記憶體區域的首地址。我們可以把函式的這個首地址(或稱入口地址)賦予一個指標變數,使指標變數指向函式所在的記憶體區域,然後通過指標變數就可以找到並呼叫該函式。這種指標就是函式指標。

相關推薦

C語言指標知識整理

指標(Pointer)就是記憶體的地址,C語言允許用一個變數來存放指標,這種變數稱為指標變數。指標變數可以存放基本型別資料的地址,也可以存放陣列、函式以及其他指標變數的地址。 程式在執行過程中需要的是資料和指令的地址,變數名、函式名、字串名和陣列名在本質上是一樣的,它們都是地

C語言基礎知識整理

除法 當前 www 做到 初步 編寫 main函數 配對 十進制數 用一個簡單的c程序例子,介紹C語言基礎知識的基本構成、格式、以及良好的書寫風格,使小夥伴對c語言有個初步認識。 例1:計算兩個整數之和的c程序: #includemain(){int a,b,sum;

C語言學習知識整理

在近兩個月的學習中,由為什麼學習C語言,到後來的逐漸接觸C語言,慢慢地去認識它,從各種資料型別,例如常量與變數。再到最基礎的算術運算和表示式,以及各種賦值及運算子。在鍵盤輸入與螢幕輸出章節中,我深深地感受到了細節的重要,無論是引號,還是地址提取符,缺一不可。 在隨後的順序,

C語言基礎知識 ---------- 指標(pointer)、結構(structure)

指標(pointer) 指標變數是一種特殊的變數,此變數儲存的內容不是普通值(int double char......)而是其它變數的地址(address)。 指標宣告:資料形態  *變數名   ---->    int 

C語言指標 易錯知識

(1) char *sptr="abc",*ptr; *ptr=sptr; 編譯時錯誤。 原因: *ptr是一個字元,sptr是一個指向字元的指標,程式碼試圖將一個字元指標賦值給一個字元,很

嘔心瀝血整理C語言指標大全,都在這裡了!

前言 相信大多數的同學都是第一門能接觸到語言是C/C++,其中的指標也是比較讓人頭疼的部分了,因為光是指標都能專門出一本叫《C和指標》的書籍,足見指標的強大。但如果不慎誤用指標,這些指標很大可能就會像惡魔一樣把你的程式給直接搞崩潰。 3個月前,我編寫了一份這些指標都是惡魔嗎?.c的檔

C語言指標整理

1、記憶體地址 記憶體是按照位元組編址的,所以它的定址單位是位元組(Byte),而一個位元組又有是由8位(bit)的0或1組成。 如果一臺計算機的記憶體是4GB,也就是說它的記憶體總位元組數有個,所以要想表示這臺計算機的記憶體地址,就要用到32位(bit)。類似於這樣的3

C語言指標基本知識

對程式進行編譯的時候,系統會把變數分配在記憶體單位中,根據不同的變數型別,分配不同的位元組大小。比如int整型變數分配4個位元組,char字元型變數分配1個位元組等等。被分配在記憶體的變數,可以通過地址去找到,記憶體區每一個位元組都有一個編號,地址也可以形象的理解成我們生活中的住址,通過住址找到每一個人所在的

起航,C語言基礎內容整理

scan 用戶交互 long 打印 起航 組成 數值 保存 .com 一、概念及基本格式 程序:為了解決某一個問題,而編寫的一系列有序指令的集合。 算法:解決問題的具體方法和步驟。 流程圖是算法的一種圖形化的表達方式。流程圖可以直觀、清晰,更有利於人們設計與理解算法。

C語言基礎知識

sig 指向 開始 extern strong font 寬度 main bsp printf函數向終端輸出若幹個任意類型的數據。 表示輸出類型的格式字符     格式字符意義 a 浮點數、十六進制數字和p-計數法(C99) A

C語言關鍵字分類整理

lse ner num 結構化 struct tex 靈魂 bool ext C語言總覽: 強類型,面向過程 簡潔、靈活:32個關鍵字(C99標準新增5個,C11新增7個),9種控制語句,34種運算符 數據類型豐富,運算符豐富 結構化(控制語句)、模塊化(函數) 靈魂、特

C語言知識

使用 小數 書寫 \n 進制 In 字節數 大小 基本 1C語言不允許嵌套註釋,如不允許/* /* / / 的嵌套註釋,因為第三個註釋符將會與第一個註釋符匹配形成註釋,而第四個註釋符將會被看成可執行程序的一部分,這時會報錯。 2.為了得到某個類型或某個變量在特定平臺上的準確

程序設計入門-C語言基礎知識-翁愷-期中測試

第一條 情況下 不出 等價 循環結構 true 語句 tdi ive 一、試題 程序設計入門—C 語言期中測評1 在代碼:while ( !e )中,!e 等價於:A.e ==0 B. e != 1 C. e!=0 D. e == 12. 以下代碼片段的輸出是:int j=

C語言指標訓練

去空字串 1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<string.h> 4 #include<stdlib.h> 5 6 char * removeSpace(c

嵌入式C語言--指標與字串

使用指標這一工具來操作字串。 定義字串變數的初始化方法 char *strptr = "liefyuan"; char strarray1[] = "liefyuan"; char strarray2[8] = "liefyuan"; char strarray3[8] = {'

C語言指標實現兩個數的互換

#include <stdio.h> void change1(int a, int b)//形參與實參不是同一個變數{ int t; t = a; a = b; b = t; } void change2(int * a, int * b)//只是把兩個變數的地址儲存的位置換了,但是變數的值

C語言 指標實現字串連線

C語言 指標實現字串連線 #include <stdio.h> #include <string.h> int main() { char s1[100], s2[100], s3[100]; char *p1=NULL; char *p2=NULL; char

C語言指標實現計算平均分等功能

4個學生5門課資料自己輸入,輸出第一門的平均分,並找出有兩門以上課程不及格的學生和平均成績在90分以上的或全部課程成績在85分以上的學生。程式不難,容易理解,但關鍵是思路要清楚。裡面涉及大量的指標的定義使用,多敲點這樣過百行的程式為以後大程式打基礎。程式碼如下: #include<iost

C語言指標——對普通變數的指標操作和對陣列(常量)的指標操作

       我們知道,每一個變數都有一個記憶體位置,每一個記憶體位置都定義了可使用連字號(&)運算子訪問的地址,它表示了在記憶體中的一個地址。        我們喜歡在程式中使用指標代替陣列,因為變數指標可

正確理解C語言指標中的 &a+1,假設a為一個數組

1.int a[5]={1,2,3,4,5}; int p=(int)(&a+1); printf("%d",*(p-1)); 答案為什麼是5? 這個問題的關鍵是理解 &a a是一個數組名,也就是陣列的首地址。 對a進行取地址運算子,得到的是一個指向陣列