C与指针——指针(一)
指針基礎簡述
6.1內存和地址
單個字節包含了存儲一個字符所需要的位數,每個字節包含8位。
存儲無符號值的范圍:0 ~ 28-1(255)
存儲有符號值的范圍:-27(-128) ~ 27-1(127)
由四個字節存儲的字,每個字包含4*8=32位
存儲無符號值的范圍:0 ~ 232-1(4294967295)
存儲有符號值的范圍:-231(-2147483648) ~ 231-1(2147483648)
高級語言通過名字而非地址來訪問內存的位置;硬件仍然通過地址訪問內存位置。
6.2 值、類型、指針變量與間接訪問
不能簡單地通過檢查一個值的位來判斷它的類型。
變量被聲明為指針并不會改變這些表達式的求值方式,一個變量的值就是分配給這個變量的內存位置所存儲的數值。
通過一個指針訪問它所指向的地址的過程稱為間接訪問或解引用指針(*)。
間接訪問操作只能作用于指針類型表達式。
因為對一個NULL指針使用解引用操作是非法的。因此在對指針進行解引用之前,首先確保它并非NULL指針。
為測試一個指針變量是否為NULL,可將它與零值進行比較。
間接訪問操作符所需要的操作數是右值,但此操作符所產生的結果是左值。
指針變量可因其是變量而作為左值使用。對指針變量進行間接訪問表示我們應該訪問指針所指向的位置。
&—— 取地址運算符。&a是變量a的地址。
*—— 指針運算符(間接訪問運算符),*p代表指針變量p指向的對象。
若偶爾需通過地址訪問內存中某個的特定位置時(即用整型字面值的形式,左值為指針常量,右值為整型常量),可通過強制類型轉換轉換成適當的類型。
6.3 指針表達式
前綴自增++操作符優先級高于*,結合性都是從右向左。
表達式*cp++可作為左值和右值存在。(先執行++)
1.++操作符產生cp的一份拷貝
2.然后++操作符增加cp的值
3.最后,在cp的拷貝上執行間接訪問操作。
表達式++*cp右值存在,左值非法。(先執行間接訪問操作)
1.首先執行間接訪問操作
2.cp所指向位置的值增加1
3.表達式的結果是這個增值后的值的一份拷貝
后綴自增(減)的優先級高于前綴自增(減)。
while((string=*strings++)!=NULL)
1.它把strings當前所指向的指針復制到變量string中
2.它增加strings的值,使它指向下一個值
3.它測試string是否為NULL
插播assert知識點:
斷言assert是一個宏,該宏在<assert.h>中,,當使用assert時候,給他個參數,即一個判讀為真的表達式。預處理器產生測試該斷言的代碼,如果斷言不為真,則發出一個錯誤信息告訴斷言是什么以及它失敗一會,程序會終止。
我們一般可以用在判斷某件操作是否成功上。
程序一般分為Debug版本和Release版本,Debug版本用于內部調試,Release版本發行給用戶使用。
斷言assert是僅在Debug版本起作用的宏,它用于檢查“不應該”發生的情況。
assert不是一個倉促拼湊起來的宏,為了不在程序的Debug版本和Release版本引起差別,assert不應該產生任何副作用。所以assert不是函數,而是宏。程序員可以把assert看成一個在任何系統狀態下都可以安全使用的無害測試手段。
以下是使用斷言的幾個原則:
1)使用斷言捕捉不應該發生的非法情況。不要混淆非法情況與錯誤情況之間的區別,后者是必然存在的并且是一定要作出處理的。
2)使用斷言對函數的參數進行確認。
在對指針執行間接訪問前,指針必須進行初始化:使它指向現有的內存或給它分配動態內存。
編程練習
1.
請編寫一個程序,它在一個字符串中進行搜索,查找所有在一個給定字符集合中出現的字符。這個函數的原型應該如下:
char *find_char(char const *source,char const *chars);它的基本想法是查找source字符串中匹配chars字符串中任何字符的第1個字符,函數然后返回一個指向source中第1個匹配所找到的位置的指針。如果source中的所有字符均不匹配chars中的任何字符,函數就返回一個NULL指針。如果任何一個參數為NULL,或任何一個參數所指向的字符串為空,函數也返回一個NULL指針。
舉個例子,假定source指向ABCDEF。如果chars指向XYZ、JURY或QQQQ,函數就返回一個NULL指針。如果chars指向XRCQEF,函數就返回一個指向source中C字符的指針。參數所指向的字符串是絕不會被修改的。
碰巧,C函數庫中存在一個名為strpbrk的函數,它的功能幾乎和這個你要編寫的函數一模一樣。但這個程序的目的是讓你自己練習操縱指針,所以:
a.你不應該使用任何用于操縱字符串的庫函數(如strcpy,strcmp,index等)。
b.函數中的任何地方都不應該使用下標引用。
分析: 這個函數是一個以指向兩個字符型常量的指針變量作為形參且返回值為指針的函數。這個題目中的“函數返回一個指向source中第一個匹配所找到位置的指針”,這一句話也值得好好思考一下。題目中提到的strpbrk,是在源字符串(s1)中找出最先含有搜索字符串(s2)中任一字符的位置并返回,若找不到則返回空指針。頭文件為#include <string.h>。
程序如下:
//方法一 #include <stdio.h>char *find_char(char const *source,char const *chars); //這里是指針變量作為函數參數,即將一個變量的地址傳送到另一個函數中 //用字符指針變量作形參和實參且函數返回指針值 int main() {char const *s="ABCDEF"; char const *c="XRCQEF";char *t;printf("source=%s\nchars=%s\n",s,c);t=find_char(s,c);printf("Matched return value:%s",t);return 0; }char *find_char(char const *source,char const *chars) {char *p;//設p為指向source中第一個匹配所找到位置的指針 if(source != NULL && chars != NULL){for(;*source != '\0';source++){for(p = chars; *p != '\0';p++)if(*p == *source)return p;}}return NULL; }//方法二 #include<stdio.h>char *find_char(char const *source,char const *chars); int main(){char m[]="ABCDEF";char n[]="XRCQEF";char *t;char const *s=m; //使指針變量s指向m數組首元素char const *c=n; //使指針變量c指向n數組首元素printf("source=%s\nchars=%s\n",s,c);t=find_char(s,c);printf("Matched return value:%s",t);return 0; } char *find_char(char const *source,char const *chars) {char *ps = source;char *pc = NULL;if(source == NULL || chars == NULL)return NULL;while(*ps != '\0'){pc = chars;while(*pc != '\0'){if(*pc == *ps)return pc;pc++;}ps++;}return NULL; }//方法三 char *find_char(char const *source,char const *chars) {int size = 0;if(source != NULL && chars != NULL){for(;*chars++ != '\0';size++);for(;*source != '\0';source++){for(chars-=size; *chars != '\0';chars++)if(*chars == *source)return chars;}}return NULL; }運行結果:
注: 在運行時,糾結過返回的指針所指的究竟是source中還是chars中的字符串首地址,最后反復讀題,根據題上所言的“指向source中的指針”可見,返回的指針不在source中,而應該是指向source中的,所以最后返回的指針所指的應該是chars中的字符串首地址。
雖然美名其曰是重新溫習,但實際清楚的知道自己是來填坑的。之前有多浪,現在需要填的坑就有多深,尤其是在進行指針這一板塊的內容時,深切體會到了大一的時候C語言老師語重心長提醒我們關于指針的知識點一定要重復多遍才能真正掌握的良苦用心。
關于指針的知識點,個人感覺,譚浩強的《C程序設計》中的講解更為詳細些,細節方面適合我這種小白閱讀;而在《C和指針》中,只簡單看完相關知識點,不參考其他的書籍,則在直接編程練習的過程中,做到一帆風順是不容易的。
綜上,這一章節的編程練習題,兩本書混合食用效果更佳~
現在看著日歷仿若是在看病危通知書
暑假自己定的計劃終究也為證明人類的本質作了貢獻
還有兩天……(Death smiles)
好多人都說生活的迷人之處在于陰差陽錯
可我不,我偏就是想要如愿以償
總結
以上是生活随笔為你收集整理的C与指针——指针(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓-利用android studio制
- 下一篇: 搜索了才发现,原来这首歌的原唱是她们,S