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

子數涵數·C語言——指針,c語言指針

編輯:關於C語言

子數涵數·C語言——指針,c語言指針


一、什麼是指針?

指針在百度的解釋:是編程語言中的一個對象,利用地址,它的值直接指向(points to)存在電腦存儲器中另一個地方的值。

也就是說,指針是用於指向某一內存單元。

簡而化之,指針便是地址

 

二、聲明指針

1.方法:數據類型 *名稱 初始化

2.例如:

int *p=&a //其中int是數據類型,p是指針變量的名稱,=&a是對指針變量p的初始化

3.注意:指針聲明完一定要初始化,否則就會變成野指針(沒有指向的目標);而且指針初始化時只能指向地址,不能指向數據(在*與&中會講到)。

 

三、使用指針

指針也是一種變量,對於指針的使用方法和對其他變量的用法一致。

野指針和空指針不同,如果對野指針進行使用,程序將會報錯。

 

四、*和&

1.*:有兩個作用,一是在聲明變量是,用來標識這個變量是指針變量;二是在其他地方作用於指針時,*代表取值,即*p就取指針p所指向的值。

(*在是聲明時,作聲明符,是一種作用;在其他地方作用於指針時,做單目運算符,又是另一種作用;還有一種情況,*表示雙目運算符,即為乘積的意思,如5*5=25)

2.&:是取地址運算符,例如&a,就是變量a的地址。

 

五、一個案例看懂指針

#include<stdio.h>
int main(void)
{
    int a=10;                    //聲明一個變量a,它的值為10
    int *p=&a;                   //聲明一個指針變量p,它的值為變量a的地址
    printf("a的值為%d\n",a);     //輸出a
    printf("a的值為%d\n",*p);    //輸出p所指向的值
    printf("a的地址為%d\n",p);   //輸出a的地址
    printf("a的地址為%d\n",&a);  //輸出p的值
    return 0;
}

 

六、空指針

1.作用:聲明一個指針後,如果暫不使用,可以先給它賦值為NULL,避免其成為野指針。

2.方法:指針名=(數據類型*)malloc(你分配的內存大小)

3.例如:

int *p;
p=(int*)malloc(4);//分配動態內存

4.注意:malloc的數據類型要和指針的數據類型一致;

內存分配後,習慣上都會進行判斷是否分配成功,不成功則退出程序;

內存分配使用完之後一定要釋放掉,free是釋放函數,所以malloc和free必須是成對出現的。

5.案例:

#include<stdio.h>
#include<stdlib.h> //malloc函數和free函數存儲在stdiib.h這個函數庫裡
int main(void)
{
    int *p;
    p=(int*)malloc(4);//分配動態內存
    if(p==NULL)
    {
        printf("內存分配失敗。\n");
        exit(-1);//退出
    }
    *p=100;
    printf("p指針中的內容=%d\n",*p);
    free(p);//內存釋放
    return 0;
}

 

七、雙級指針

雙級指針就是指向指針的指針,即:

int*p1=&a; //指針p1指向a的地址
int*p2=p1; //指針p2指向p1

例如:

#include<stdio.h>
int main(void)
{
    int a=1;
    int *p1=&a;
    int *p2=p1;
    printf("%d\n",*p2); //輸出指針p2所指向的指針p1所指向的變量a的值
    return 0;
}

 

八、番外

注意看上一個案例,如果我們把p=(int*)malloc(4)改為2,就會報錯,如下圖(這被稱為內存越界)。

這是為什麼呢,這就關乎到數據長度的問題了,因為在VC6.0出生時,系統和CPU發展到32位,所以VC6.0是32位的編譯器,在VC6.0中,int的數據長度為32/8=4字節;

而TC2.0出生時,系統和CPU還停留在16位,所以TC2.0是16位的編譯器,在TC2.0中,int的數據長度為16/8=2字節。

 

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