指針

C的精髓指針,本文基于C程序設計(譚浩強版)所寫。

指針

直接訪問
間接訪問

指針:一個變量的地址稱為該變量的“指針”。

指針變量:存放另一變量地址的變量。

指針變量的值是地址(指針)。

指針變量

類型名 *指針變量名;

類型名 是定義指針變量時必須指定的“基類型”。指針變量時基本數據類型派生出來的類型,它不能離開基本類型而獨立存在。

一個變量的指針包含兩個方面,一是以存儲單元編號表示的地址(如編號為2000的字節(jié)),一是它指向的存儲單元的數據類型(如int,char,float)。

int *a;//a是指向整型數據的指針變量
float *b;//b是指向單精度型數據的指針變量
char *c;//c是指向字符型數據的指針變量

指針類型:int */char */float *

指針變量中只能存放地址(指針),不要將證一個整數賦給一個指針變量。
比如* pointer = 100是錯誤的。

引用指針變量

  • 給指針變量賦值。p=&a
  • 引用指針變量指向的變量。* p
  • 引用指針變量的值。p

&/*

  • & 取地址運算符。
  • * 指針運算符。

示例:

#include <iostream>
#include <stdlib.h>
using namespace std;
<!-- 錯誤,交換的是形參a,b的值,即二者地址進行了交換 -->
//void swap(int *a,int *b)
//{
//    int *temp;
//    temp = a;
//    a = b;
//    b = temp;
//}
<!-- 正確,交換的是形參a,b所指向地址的值,進而改變主函數中的a,b -->
void swap(int *a,int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

int main()
{
    int a,b;
    a = 5;
    b = 3;
    swap(&a,&b);
    cout<<a<<" "<<b;
    system("pause");
    return 0;
}

通過指針引用數組

數組元素的指針就是數組元素的地址。

int a[10];
int *p;
p = &a[0];//p的值是a[0]的地址
p = a;//p的值是a首元素(即a[0])的地址。
//**數組名不代表整個數組,只代表數組首元素的地址。**

當指針指向數組元素時,p+1指向同一數組中的下一個元素p-1指向同一數組中的上一個元素。

當兩個指針p1,p2指向統一數組時,p2-p1的值是地址差除以元素的長度。即二者相差的元素的個數。兩地址相加是沒有意義的。

通過指針引用數組元素

  • 下標法,a[i]
  • 指針法,(a+i);(p+i)

示例(混搭大法好啊_):

#include <iostream>
#include <stdlib.h>
using namespace std;

int main()
{
    int a[10],i;
    int *p = a;
    cout<<"請輸入是個整數:"<<endl;
    for (i=0;i<10;i++)
    {
        scanf("%d",p++);//不能用cin>>(p++);語法錯誤
    }
    p = a;
    for (i=0;i<10;i++)
    {
        printf("%d",*(p++));//cout<<*(p++)<<endl;二者均可
    }
    system("pause");
    return 0;
}

通過指針引用多維數組

以二維數組為例
int a[3][4];

表示形式 含義 地址
a 二維數組名,指向一位數組a[0],即0行首地址 2000
a[0],[a+0],a 0行0列元素地址 2000
a+1,&a[1] 1行首地址 2016
a[1],*(a+1) 1行0列元素a[1][0]的地址 2016
a[1]+2,*(a+1)+2,&a[1][2] 1行2列元素a[1][2]的地址 2024
(a[1]+2),(*(a+1)+2),a[1][2] 1行2列元素a[1][2]的值 元素值13

通過指針引用字符串

char string[] = "hello";
printf("%s\n",string);
printf("%c\n",string[4]);
printf("%c\n",*(string+4));

字符數組與字符指針變量區(qū)別

  • 字符數組由若干個元素組成,每個元素中放一個字符,而字符指針變量中存放的是地址(字符串第一個字符的地址)。
  • 可以對字符指針變量賦值,但不能對數組名賦值。正確:char *a;a="zdy";錯誤:char str[10];str = "zdy"
  • 初始化方式。char *a = "zdy";char str[10] = "zdy"
  • 存儲單元內容。編譯時為字符數組分配若干存儲單元;對字符指針變量,只分配一個存儲單元(VC 4個字節(jié))。
    char *a;scanf("%s",a);//錯誤,將a指向鍵盤輸入的字符串。
    char *a,str[10];a = str;scanf("%s",a);//正確。
  • 指針變量的值可以改變,但是數組名代表一個固定的值,不能改變。

指針數組

類型名 *數組名[數組長度];
int *p[4];

動態(tài)內存分配

malloc

void *malloc(unsigned int size);

函數返回分配區(qū)域的第一個字節(jié)的地址。指針的基類型為void,即不指向任何類型的數據,只提供一個地址。執(zhí)行失敗返回NULL。
示例:

malloc(100);

calloc(動態(tài)數組)

void *calloc(unsigned n,unsigned size);

在內存動態(tài)從存儲區(qū)中分配n個長度為size的連續(xù)空間??梢詾橐晃粩到M開辟動態(tài)存儲空間。即動態(tài)數組。函數返回所分配域的起始地址的指針,失敗返回NULL。
示例:

p = calloc(50,4);開辟50*4字節(jié),起始地址賦給指針變量p。50個長度為4的數組。

free

void free(void *p);

釋放p所指向的動態(tài)空間。p是最近一次調用calloc或malloc函數時得到的函數返回值。free函數無返回值。
示例:

free(p);

realloc

void *realloc(void *p,unsigned int size);

將p所指向的已分配的動態(tài)空間大小改為size。
示例:

realloc(p,50);//將p所指向的已分配的動態(tài)空間改為50字節(jié)。

示例:

#include <iostream>
#include <stdlib.h>
using namespace std;

int main()
{
    void check(int *);
    int *p;
    p = (int *)malloc(5*sizeof(int));// p = malloc(5*sizeof(int));亦可
    printf("請輸入五個學生的成績:");
    for (int i = 0;i<5;i++)
    {
        scanf("%d",p+i);
    }
    check(p);
    system("pause");
    return 0;
}
void check(int *p)
{
    printf("低于60分的有:");
    for (int i = 0;i<5;i++)
    {
        if (p[i]<60)
        {
            printf("%d ",p[i]);
        }
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容

  • 指針是C語言中廣泛使用的一種數據類型。 運用指針編程是C語言最主要的風格之一。利用指針變量可以表示各種數據結構; ...
    朱森閱讀 3,470評論 3 44
  • void* 類型指針:通用變體類型指針;可以不經轉換,賦給其他指針,函數指針除外;malloc返回的就是void*...
    冰吉凌閱讀 3,369評論 0 18
  • C語言指針的總結 1. 變量 不同類型的變量在內存中占據不同的字節(jié)空間。 內存中存儲數據的最小基本單位是字節(jié),每一...
    xx_cc閱讀 3,816評論 11 39
  • 1.語言中變量的實質 要理解C指針,我認為一定要理解C中“變量”的存儲實質, 所以我就從“變量”這個東西開始講起吧...
    金巴多閱讀 1,804評論 0 9
  • 我在煙臺邊走邊吃邊愛,反正人山人海,反正時光大把。 上周六在學校實在是悶的慌,所以果斷拉著狐朋狗友去開拓領土,說白...
    全世界早安閱讀 539評論 0 2