c语言指针向前移动i个位置,C语言指针
第6章 指針
1. 指針
指針簡介:所有的數(shù)據(jù)都是存放在存儲器中。一般把存儲器中的一個字節(jié)稱為一個內(nèi)存單元,為了正確的訪問這些內(nèi)存單元,必須在每個內(nèi)存單元編上號,根據(jù)一個內(nèi)存單元的編號即可準(zhǔn)確的找到該內(nèi)存單元;內(nèi)存單元的編號也可叫為地址;即根據(jù)內(nèi)存單元的編號或地址就可以找到所需的內(nèi)存單元,通常也把這個地址稱為指針
對于一個內(nèi)存單元來說,單元的地址即為指針,其中存放的數(shù)據(jù)才是該單元的內(nèi)存,用一個變量來存放指針,這種變量稱為指針變量;一個指針變量的值就是某個內(nèi)存單元的地址或稱為某個內(nèi)存單元的指針
“指針”是指地址,是常量;“指針變量”是指取值為地址的變量;定義指針的目的是為了通過指針去訪問內(nèi)存單元
2. 指針變量的類型說明
對指針變量的類型說明:
1) 指針類型說明,即定義變量為一個指針變量
2) 指針變量名
3) 變量值(指針)所指向的變量的數(shù)據(jù)類型
其一般形式: 類型說明符 *變量名
其中 ***** 表示這是一個指針變量,變量名即為定義的指針變量名,類型說明符表示本指針變量所指向的變量的數(shù)據(jù)類型
3. 指針變量的賦值
指針變量的賦值:只能賦予地址,決不能賦予任何其他數(shù)據(jù);提供了地址運算符 & 來表示變量的地址,一般形式: & 變量名; 如&a表示變量a的地址,&b表示變量b的地址。 變量本身必須預(yù)先說明。設(shè)有指向整型變量的指針變量p,如要把整型變量a 的地址賦予p可以有以下兩種方式:
(1)指針變量初始化的方法
1 int a;
2 int *p=&a;
(2)賦值語句的方法
1 int a;
2 int *p;
3 p=&a;
不允許把一個數(shù)賦予指針變量,故下面的賦值是錯誤的: int *p;p=1000; 被賦值的指針變量前不能再加“*”說明符,如寫為 *p=&a; 也是錯誤的
4. 指針變量的運算
指針變量是可以進行某些運算,只能進行賦值運算 和 部分算術(shù)運算及關(guān)系運算
指針運算符
1) 取地址運算符 &: 是單目運算符,其結(jié)合性是自右至左,其功能是取變量的地址
2) 取內(nèi)容運算符 * : 是單目運算符,其結(jié)合性是自右至左,用來表示指針變量所值的變量
賦值運算:
1) 指針變量初始化賦值
2) 把一個變量的地址賦予指向相同數(shù)據(jù)類型的指針變量
1 int a, *pa;
2 pa = &a;
3) 把一個指針變量的值賦予指向相同類型變量的另一個指針變量
1 int a, *pa = &a, *pb;
2 pb = pa;
4) 把數(shù)組的首地址賦予指向數(shù)組的指針變量
1 // 數(shù)組名表示數(shù)組的首地址,故可賦予指向數(shù)組的指針變量pa
2 int a[6], *pa; pa = a;
3 // 數(shù)組第一個元素的地址也是整個數(shù)組的首地址
4 pa = &a[0];
5) 把字符傳的首地址賦予指向字符類型的指針變量
1 // 初始化賦值的方式
2 // 并不是把整個字符串裝入指針變量,而是把存放該
3 // 字符串的字符數(shù)組的首地址裝入指針變量
4 char *pc = "C Language"
6) 把函數(shù)的入口地址賦予指向函數(shù)的指針變量
1 // f為函數(shù)名
2 int (*pf)(); pf = f;
加減算術(shù)運算:對于指向數(shù)組的指針變量,可以加上或減去一個整數(shù)n,指針變量加或減一個整數(shù)n的意義:是把指針指向的當(dāng)前位置(指向某數(shù)組元素)向前或向后移動n個位置
1) 因為數(shù)組有不同的類型,各種類型的數(shù)組元素所占的字節(jié)長度不同;如指針變量加 1,即向后移動 1 個位置表示指針變量指向下一個數(shù)組元素的首地址,而不是原地址基礎(chǔ)上加 1
1 int a[5], *pa;
2 pa = a; // pa指向數(shù)組a,也是指向a[0]
3 pa = pa + 2; // pa指向a[2],即pa的值為&pa[2]
2) 指針變量的加減運算只能對數(shù)組指針變量進行,對指向其它類型變量的指針變量作加減運算是毫無意義的
3) 兩個指針變量之間的運算只有指向同一數(shù)組的兩個指針變量之間才能進行運算
4) 兩指針變量相減:所得之差是兩個指針?biāo)笖?shù)組元素之間相差的元素個數(shù);
5) 兩指針變量進行關(guān)系運算:指向同一數(shù)組的兩指針變量進行關(guān)系運算可表示他們所指數(shù)組元素之間的關(guān)系:
pf1 == pf2表示pf1和pf2指向同一數(shù)組元素
pf1 > pf2表示pf1處于高地址位置
pf1 < pf2表示pf2處于低地址位置
設(shè) p 為指針變量,則 p == 0 表明 p 是空指針,不指向任何變量; p != 0; 表示不是空指針;#define NULL 0 int *p = NULL; 對指針變量賦0值和不賦值是不一樣的,為賦值時,可以是任意值,但不能使用,將造成意外錯誤;賦0值后,可以使用,只是不指向具體的變量而已
5. 數(shù)組指針變量的說明和使用
數(shù)組指針:指向數(shù)組的指針變量。
一個數(shù)組是由連續(xù)的一塊內(nèi)存單元組成的,數(shù)組名是這連續(xù)內(nèi)存單元的首地址,一個數(shù)組也是由各個數(shù)組元素(下標(biāo)變量) 組成的,每個數(shù)組元素按其類型不同占有幾個連續(xù)的內(nèi)存單元,一個數(shù)組元素的首地址也是指它所占有的幾個內(nèi)存單元的首地址。一個指針變量即可以指向一個數(shù)組,也可以指向一個數(shù)組元素,可把數(shù)組名或第一個元素的地址賦予它;如要使指針變量指向第 i 號元素可以把 i 元素的首地址賦予它或把數(shù)組名加 i 賦予它
數(shù)組指針變量說明:一般形式: 類型說明符 指針變量名其中類型說明符表示所指數(shù)組的類型
引入指針變量后,可以用以下方式訪問數(shù)組元素:
· 下標(biāo)發(fā):即用 a[i]形式訪問數(shù)組元素
· 指針法:即采用(pa + i)形式,間接訪問的方法來訪問數(shù)組元素
6. 指向多維數(shù)組的指針變量
多維數(shù)組的指針變量:是一種地址計算方法,表示數(shù)組 a 第 i 行首地址。因此我們得出:a[i], &a[i], *(a + i), 和 (a + i) 都是相同的。
a[0]也可以看成 a[0]+0是一維數(shù)組 a[0]的0號元素的首地址,而 a[0]+1 則是 a[0] 的1號元素首地址,由此得出 a[i]+j 則是一維數(shù)組 a[i] 的j號元素首地址,他等于 &a[i][j]; 由 a[i] = *(a+i) 得 a[i]+j = *(a+i)+j 由于 *(a+i)+j 是二維數(shù)組 a 的 i 行 j 列元素的首地址; 該元素的值等于 *(*(a+i)+j)
二維數(shù)組的指針變量:其一般形式:類型說明符 (*指針變量名)[長度]; 其中”類型說明符“為所指數(shù)組的數(shù)據(jù)類型;“*” 表示其后的變量是指針類型;“長度”表示二維數(shù)組分解為多個一維數(shù)組時,一維數(shù)組的長度,也是二維數(shù)組的列數(shù);
7. 使用字符串指針變量與字符數(shù)組的區(qū)別
都可以實現(xiàn)字符串的存儲 和 運算,兩者區(qū)別的說明:
1) 字符串指針變量本身是一個變量,用于存放字符串的首地址;而字符串本身是存放在以該首地址為首的一快連續(xù)的內(nèi)存空間中并以"\0"作為串的結(jié)束。字符數(shù)組是由于若干個數(shù)組元素組成的,可用來存放整個字符串
2) 對字符數(shù)組做初始化賦值,必須采用外部類型或靜態(tài)類型,如:static char st[] = {"C Language"};; 而對字符串指針變量則無次限制;如:char *ps = "C Language"
3) 對字符串指針方式:char *ps = "C Language" 可以寫為:char *ps; ps = "C Language"; 而對數(shù)組方式不能寫成:char st[20]; st = {"C Language"};只能對字符數(shù)組的元素逐個賦值
8. 函數(shù)指針變量
函數(shù)指針變量:一個函數(shù)總是占用一段連續(xù)的內(nèi)存區(qū),而函數(shù)名就是該函數(shù)所占內(nèi)存區(qū)的首地址。可以把函數(shù)的這個首地址(入口地址)賦予一個指針變量,使該指針變量指向該函數(shù),然后通過指針變量就可以找到并調(diào)用這個函數(shù)。
函數(shù)指針變量定義的一般形式: 類型說明符 (指針變量名)(), ""表示后面的變量是定義的指針變量;最后的空括號表示指針變量所指的是一個函數(shù)
總結(jié)
以上是生活随笔為你收集整理的c语言指针向前移动i个位置,C语言指针的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: protel99SE - 多张原理图生成
- 下一篇: 读硬盘序列号