程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言指針學習,c語言指針

C語言指針學習,c語言指針

編輯:關於C語言

C語言指針學習,c語言指針


  C語言學過好久了,對於其中的指針卻沒有非常明確的認識,趁著有機會來好好學習一下,總結一下學過的知識,知識來自C語言指針詳解一文

一:指針的概念

  指針是一個特殊的變量,裡面存儲的數值是內存裡的一個地址。學好指針,重要的是搞清楚指針的四個方面的內容:指針的類型、指針所指向的類型、指針所指向的內存區、指針本身占據的內存區。

1、 如何判斷指針的類型呢:

  

int *p;
char *p;
int **p;
int (*p)[3];
int *(*p)[4];

  上面的五個聲明,指針的類型分別是:int *、char *、int ** 、 int (*)[3]、int *(*)[4];是不是非常簡單,就是把變量名去掉,剩下的就是指針的類型。

2、指針所指向的類型

int *p;
char *p;
int **p;
int (*p)[3];
int *(*p)[4];

  上面五個聲明,指針所指向的類型分別是:int\char \int *\int()[3]\int *()[4],找出規律了嗎?就是把變量名和一個*去掉,剩下的就是指針所指向的類型。特別強調:指針的類型和指針所指向的類型是不同的概念。

3、指針所指向的內存區或者指針的值

  指針的值是指針本身所存儲的數值,這個值被編譯器當作一個地址,而不是而不是一個一般的數值。在32位程序裡,所有的類型的指針的值都是一個32位數,因為32位程序中內存地址全部都是32位字長。

  指針所指向的內存區就是從指針的值所代表的內存區開始,長度為sizeof(指針所指向的類型)的一篇內存區。以後,我們說一個指針的值是XX,就代表了該指針指向了以XX為首地址的一片內存區域;我們說一個指針指向了某個內存區域,相當於指針的值就是該內存區域的首地址。

  指針指向誰,就把誰的地址賦給指針。

4、指針本身所占據的內存區

  指針本身占據了多大的內存。用sizeof(指針的類型)測試一個就知道了。在32位平台裡,指針本身占據了四個字節的長度。

二、指針的算術運算

  

char a[20];
int *p=a;
p++;

  指針p的類型是 int * ,指針所指向的類型是int ,它被初始化位指向整形變量a,接下來指針p被加了1,編譯器是這樣處理的:它把指針p的值加上了sizeof(int),在32位程序裡,是加上了4.由於地址是用字節做單位的,故p的地址由原來的a的地址指向了加四個字節後的高地址。

  由於char類型的長度是一個字節,所以原來p是指向數組從0開始的四個字節,現在指向了從第四個字節開始的四個字節

  我們可以用一個指針和一個循環來遍歷一個數組:

  

int arr[20];
int *p=arr;
.......//此處略去整數型賦值的代碼
for(i = 0; i<20 ; i++)
{
    (*p)++;
    P++;        
}

  這個例子將整數型數組各個單元的值加1,由於每次循環都將指針p,所以每次循環都能訪問數組的下一個單元。

char a[20];
int *p=a;
...
...
p+=5;

  在這個例子中,p被加上了5,從編譯器的角度看:將指針p的值加上sizeof(int),在32位恆旭中就是加上了5*4=20.由於地址的單位十字街,故現在p指向剛開始高字節方向的20個字節。在這個例子中,沒加5之前的p指向數組第0個單元開始的四個字節,加5後,p已經指向數組的合法范圍之外了。雖然這種情況在應用上會出現問題,但在語法上是可以。這體現了指針的靈活性。

  總結一下:一個指針,加上一個整數n後,結果是一個新的指針pnew,pnew的類型和pnew所指向的類型與pold的類型都是一樣的。pnew的值比起pold的值增加了n*sizeof(p指向的類型)個字節。加是往高字節移動,減是往低字節移動。

三 運算符&和*

  &是取地址運算符,*在書上叫做間接運算符。&a的運算結果是一個指針,指針的類型是a的類型加一個*。指針所指向的類型是a的類型,指針所指向的地址就是a的地址。*p的結果是p所指向的結果,類型是p的類型,占用的地址就是p所指向的地址

int a =12;
int b;
int *p;
int *ptr;

p=&a//&a的結果是一個指針,指針的類型是一個int *,指針所指向的數據類型是int ,指向的地址是a的地址。

*p=24;//*p的結果,它的類型是int,它所占用的地址是p所指向的地址,顯然*p就是變量a

*ptr=&P;//p本身就是一個指針了,對p在取地址,那麼 該指針的類型是int **,指針所知下個的類型是 int * 。指針所指向的地址就是p的地址

**ptr=34;// *ptr的結果就是ptr所指向的東西。在這裡是一個指針,對這個指針在做一次*運算,。結果就是一個int 類型的變量

四 指針表達式

  一個表達式的最後結果如果是一個指針,這個表達式就叫做指針表達式

  

int a ,b ;
int array[10];
int *pa;

pa=&a;//指針表達式
int **ptr = &pa;//表達式
*ptr=&b;//表達式
pa=array;
pa++;//表達式


char arr[20];
char **parr =arr//如果把arr看作指針的話,arr也是指針表達式
char *str;

str=*parr;//指針表達式
str=*(parr+1);//指針表達式

  由於指針表達式的結果是一個指針,所以指針表達式也需要具有指針的四個要素:指針的類型,指針所指向的類型、指針指向的內存區、指針自身占據的內存區。

  指針在左邊表示賦值,指針在右邊表示取值。

未完待續


C語言指針學習

用指針難,但是高效,就如:float類型它占4個字節,而指針永遠是兩個字節,使用它能提速,特別是什麼函數那些,呵呵。說實話,能上網,直接找課件,找關於指針這章的就是。路過。。。。舉例就不談了,想學就先看書的例子。(我覺得你像以前的我一樣,都覺得用指針都是浪費表情)放點耐心,指針是難點,花多點時間,對你有好處。。
 

學習C語言的指針部分有什好的方法?真的很難!!

C的精髓——指針

指針是一個特殊的變量,它裡面存儲的數值被解釋成為內存裡的一個地址。 要搞清一個指針需要搞清指針的四方面的內容:指針的類型,指針所指向的 類型,指針的值或者叫指針所指向的內存區,還有指針本身所占據的內存區。讓我們分別說明。
先聲明幾個指針放著做例子:
例一:
(1)int*ptr;
(2)char*ptr;
(3)int**ptr;
(4)int(*ptr)[3];
(5)int*(*ptr)[4];

指針的類型
從語法的角度看,你只要把指針聲明語句裡的指針名字去掉,剩下的部分就是這個指針的類型。這是指針本身所具有的類型。讓我們看看例一中各個指針的類型:
(1)int*ptr;//指針的類型是int*
(2)char*ptr;//指針的類型是char*
(3)int**ptr;//指針的類型是int**
(4)int(*ptr)[3];//指針的類型是int(*)[3]
(5)int*(*ptr)[4];//指針的類型是int*(*)[4]
怎麼樣?找出指針的類型的方法是不是很簡單?
指針所指向的類型
當你通過指針來訪問指針所指向的內存區時,指針所指向的類型決定了編譯器將把那片內存區裡的內容當做什麼來看待。
從語法上看,你只須把指針聲明語句中的指針名字和名字左邊的指針聲明符*去掉,剩下的就是指針所指向的類型。例如:
(1)int*ptr;//指針所指向的類型是int
(2)char*ptr;//指針所指向的的類型是char
(3)int**ptr;//指針所指向的的類型是int*
(4)int(*ptr)[3];//指針所指向的的類型是int()[3]
(5)int*(*ptr)[4];//指針所指向的的類型是int*()[4]
在指針的算術運算中,指針所指向的類型有很大的作用。
指針的類型(即指針本身的類型)和指針所指向的類型是兩個概念。當你對C越來越熟悉時,你會發現,把與指針攪和在一起的"類型"這個概念分成"指針的類型"和"指針所指向的類型"兩個概念,是精通指針的關鍵點之一。我看了不少書,發現有些寫得差的書中,就把指針的這兩個概念攪在一起了,所以看起書來前後矛盾,越看越糊塗。
指針的值,或者叫指針所指向的內存區或地址
指針的值是指針本身存儲的數值,這個值將被編譯器當作一個地址,而不是一個一般的數值。在32位程序裡,所有類型的指針的值都是一個32位整數,因為32位程序裡內存地址全都是32位長。 指針所指向的內存區就是從指針的值所代表的那個內存地址開始,長度為si zeof(指針所指向的類型)的一片內存區。以後,我們說一個指針的值是XX,就相當於說該指針指向了以XX為首地址的一片內存區域;我們說一個指針指向了某塊內存區域,就相當於說該指針的值是這塊內存區域的首地址。
指針所指向的內存區和指針所指向的類型是兩個完全不同的概念。在例一中,指針所指向的類型已經有了,但由於指針還未初始化,所以它所指向的內存區是不存在的,或者說是無意義的。
以後,每遇到一個指針,都應該問問:這個指針的類型是什麼?指針指的類型是什麼?該指針指向了哪裡?
......余下全文>>
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved