C語(yǔ)言指針

在C語(yǔ)言中,每一個(gè)變量都有一個(gè)內(nèi)存位置,每一個(gè)內(nèi)存位置都定義了可使用連字號(hào)(&)運(yùn)算符訪(fǎng)問(wèn)的地址,它表示了在內(nèi)存中的一個(gè)地址。指針是C語(yǔ)言的重中之重及精華的地方,所以我盡量多些代碼來(lái)熟悉,看一個(gè)Demo:

#include<stdio.h>
int main()
{
    int var1 = 10;
    char var2[10];
    printf("address of var1 is %p \n",&var1);
    printf("address of var2 is %p \n",&var2);
    return 0;
}
result:
address of var1 is 00CFFD5C
address of var2 is 00CFFD48

什么是指針

指針是一個(gè)變量,其值為另一個(gè)變量的地址,即,內(nèi)存位置的直接地址。就像其他變量或常量一樣,您必須在使用指針存儲(chǔ)其他變量地址之前,對(duì)其進(jìn)行聲明。指針變量聲明的一般形式為:

type *var_name
int *ip; //一個(gè)指向整型的指針
char *ch; //一個(gè)指向char類(lèi)型的指針

所有實(shí)際數(shù)據(jù)類(lèi)型,不管是整型、浮點(diǎn)型、字符型,還是其他的數(shù)據(jù)類(lèi)型,對(duì)應(yīng)指針的值的類(lèi)型都是一樣的,都是一個(gè)代表內(nèi)存地址的長(zhǎng)的十六進(jìn)制數(shù)。
不同數(shù)據(jù)類(lèi)型的指針之間唯一的不同是,指針?biāo)赶虻淖兞炕虺A康臄?shù)據(jù)類(lèi)型不同

如何使用指針

使用指針時(shí)會(huì)頻繁進(jìn)行以下幾個(gè)操作:定義一個(gè)指針變量、把變量地址賦值給指針、訪(fǎng)問(wèn)指針變量中可用地址的值。這些是通過(guò)使用一元運(yùn)算符 * 來(lái)返回位于操作數(shù)所指定地址的變量的值??磀emo:

#include<stdio.h>
int main()
{
    int var = 0;
    int \*pointer = &var; //得到變量var儲(chǔ)存的地址
    printf("address of var is %p\n",&var);
    printf("address of var is %p\n",pointer);
    printf("data is %d\n",*pointer);  //*運(yùn)算符為取出地址的內(nèi)容
    return 0;
}
result:
address of var is 00DBF95C
address of var is 00DBF95C
data is 0

指針數(shù)組和數(shù)組指針

看demo

#include <stdio.h>
const int MAX = 3;
int main ()
{
   int  var[] = {10, 100, 200};
   int i, \*ptr[MAX];  //指針數(shù)組
   for ( i = 0; i < MAX; i++)
   {
      ptr[i] = &var[i]; /* 賦值為整數(shù)的地址 */
   }
   for ( i = 0; i < MAX; i++)
   {
      printf("Value of var[%d] = %d\n", i, *ptr[i] );
   }
   return 0;
}

C語(yǔ)言沒(méi)有字符串,可用數(shù)組,Demo:

#include <stdio.h>
const int MAX = 4;
int main ()
{
   const char *names[] = {
                   "Zara Ali",
                   "Hina Ali",
                   "Nuha Ali",
                   "Sara Ali",
   };//聲明了一個(gè)字符串指針數(shù)組
   int i = 0;
   for ( i = 0; i < MAX; i++)
   {
      printf("Value of names[%d] = %s\n", i, names[i] );
   }
   return 0;
}

指向指針的指針

指向指針的指針是一種多級(jí)間接尋址的形式,或者說(shuō)是一個(gè)指針鏈。通常,一個(gè)指針包含一個(gè)變量的地址。當(dāng)我們定義一個(gè)指向指針的指針時(shí),第一個(gè)指針包含了第二個(gè)指針的地址,第二個(gè)指針指向包含實(shí)際值的位置
pointer.PNG

int **ptr; //ptr指向一個(gè)指針,該指針指向一個(gè)int類(lèi)型的數(shù)據(jù)

#include<stdio.h>
int main()
{
    int var = 100;
    int *ptr;
    int **pptr;
    ptr = &var;
    pptr = &ptr;
    printf("data of var is : %d\n",var);
    printf("data of prt is %p\n",ptr);
    printf("the data store in  prt is %d\n",*ptr);
    printf("data of pprt is %p\n",pptr);
    printf("the data store in  pprt is %p\n",*pptr);
    return 0;
}
result:
data of var is : 100
data of prt is 00D3FCC0
the data store in  prt is 100
data of pprt is 00D3FCB4
the data store in  pprt is 00D3FCC0
//可以看到,var的值為100,它存儲(chǔ)的位置是00D3FCC0
//ptr的值為00D3FCC0,它儲(chǔ)存的位置是00D3FCB4
//因此,可以通過(guò)pptr一步步鏈接找到vae的值
//指針的指針即是指向指針的指針

傳遞指針給函數(shù)

C 語(yǔ)言允許您傳遞指針給函數(shù),只需要簡(jiǎn)單地聲明函數(shù)參數(shù)為指針類(lèi)型即可。

#include<stdio.h>
void assignment(int *ptr); //接受一個(gè)指向int類(lèi)型的數(shù)據(jù)的指針作為參數(shù)
int main()
{
    int var = 10;
    printf("before assignment: %d\n",var);
    assignment(&var);
    printf("after assignment: %d\n",var);
    return 0;
}
void assignment(int *ptr)
{
    *ptr = 20;
}
result:
before assignment: 10
after assignment: 20
//傳遞指針到函數(shù)是直接對(duì)地址進(jìn)行操作,所以可以修改值
//DEMO:傳遞數(shù)組給函數(shù)
\#include<stdio.h>
\#include<stdlib.h>
void increase(int *ptr,int size);
int main()
{
    int Arr[3] = {0};
    int i = 0;
    printf("before increase\n");
    for(i= 0 ;i < 3;i++ )
    {
        printf("%d  ",Arr[i]);
    }
    increase(Arr,3);
    printf("\nafter increase\n");
    for(i= 0 ;i < 3;i++ )
    {
        printf("%d  ",Arr[i]);
    }
    system("pause");
    return 0;
}
void increase(int *ptr,int size)
{
    int i;
    for(i = 0; i <size ; i++ )
    {
        *(ptr+i) =i;
    }
    return ;
}
result:
before increase
0  0  0
after increase
0  1  2

函數(shù)指針

函數(shù)指針是指向函數(shù)的指針變量。通常我們說(shuō)的指針變量是指向一個(gè)整型、字符型或數(shù)組等變量,而函數(shù)指針是指向函數(shù)。函數(shù)指針可以像一般函數(shù)一樣,用于調(diào)用函數(shù)、傳遞參數(shù)。
函數(shù)指針變量的聲明:

datatype (*ptr) (datatype,datatype)

#include<stdio.h>
#include<stdlib.h>
int max_n(int a ,int b)
{
    if(a>b)
        return a;
    else
        return b;
}
int main()
{
    int (* ptr)(int,int) = max_n; //指向max函數(shù)
    int a , b;
    a = 2;
    b = 4;
    printf("%d  ",ptr(a,b));//直接調(diào)用函數(shù)
    return 0; }

***回調(diào)函數(shù)

函數(shù)指針作為某個(gè)函數(shù)的參數(shù):函數(shù)指針變量可以作為某個(gè)函數(shù)的參數(shù)來(lái)使用的,回調(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù)。簡(jiǎn)單講:回調(diào)函數(shù)是由別人的函數(shù)執(zhí)行時(shí)調(diào)用你實(shí)現(xiàn)的函數(shù)。

#include<stdio.h>
#include<stdlib.h>
int getNumber(void)
{
    return rand();
}
int getNumber(int a)
{
    return rand();
}
void GetArr(int *ptr,int size,int (*getNumber)(void)) //注意這里引用的格式
{
    int i;
    for(i = 0;i<size;i++)
    {
        ptr[i] = getNumber();
    }
}
int main()
{
    int data[10];
    int i = 10;
    GetArr(data,10,getNumber);
    for(i=0;i<10;i++)
    {
        printf("%d ",data[i]);
    }
    printf("\n");
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容