C 語言基礎(chǔ)教程

C 語言流程控制

C 語言函數(shù)

C 語言數(shù)組

C 語言指針

C 語言字符串

C 語言結(jié)構(gòu)體

C 語言文件

C 其他

C 語言參考手冊

C 語言指針

在本教程中,您將學習指針。什么是指針,如何使用它們以及在示例的幫助下使用它們時可能遇到的常見錯誤。

指針是 C和C ++ 編程的強大功能。在學習指針之前,讓我們學習一下C語言編程中的地址。

C 語言地址

如果程序中有變量var,則&var將在內(nèi)存中提供其地址。

使用scanf()函數(shù)時,我們已多次使用地址。

scanf("%d", &var);

在此,用戶輸入的值存儲在var變量的地址中。讓我們舉一個可行的實例。

#include <stdio.h>
int main()
{
  int var = 5;
  printf("var: %d\n", var);

  // 注意在var之前使用&
  printf("address of var: %p", &var);  
  return 0;
}

輸出結(jié)果

var: 5 
var地址: 2686778

注意:運行上面的代碼時,您可能會獲得其他地址。

C 語言指針

指針(指針變量)是用于存儲地址而非值的特殊變量。

指針語法

這是我們?nèi)绾温暶髦羔樀姆椒ā?/p>

int* p;

在這里,我們已經(jīng)聲明了一個int類型的指針p。

您也可以通過以下方式聲明指針。

int *p1;
int * p2;

讓我們再舉一個聲明指針的實例。

int* p1, p2;

在這里,我們聲明了一個指針p1和一個普通變量p2。

給指針分配地址

讓我們舉個實例。

int* pc, c;
c = 5;
pc = &c;

在此,將5分配給c變量。并且,將c的地址分配給pc指針。

獲取指針所指向的值

為了獲得指針所指向的內(nèi)容的值,我們使用了解引用運算符(*)。例如:

int* pc, c;
c = 5;
pc = &c;
printf("%d", *pc);   // 輸出: 5

此處,c的地址已分配給pc指針。為了獲取存儲在該地址中的值,我們使用了*pc。

改變指針指向的值

讓我們舉個實例。

int* pc, c;
c = 5;
pc = &c;
c = 1;
printf("%d", c);    // 輸出: 1
printf("%d", *pc);  // 輸出: 1

我們已經(jīng)將c地址分配給了pc指針。

然后,我們將的值更改c為1。由于pc和的地址c相同,因此*pc得到1。

讓我們再舉一個實例。

int* pc, c;
c = 5;
pc = &c;
*pc = 1;
printf("%d", *pc);  // 輸出: 1
printf("%d", c);    // 輸出: 1

我們已經(jīng)將c地址分配給了pc指針。

然后,我們使用* pc = 1;將* pc更改為1。 由于pc和c的地址相同,因此c等于1。

讓我們再舉一個實例。

int* pc, c, d;
c = 5;
d = -15;

pc = &c; printf("%d", *pc); // 輸出: 5
pc = &d; printf("%d", *pc); // 輸出: -15

最初,使用的地址c分配給pc指針pc = &c;。因為c是5,所以*pc給我們5。

然后,使用將地址d分配給pc指針pc = &d;。由于d是-15,所以*pc給我們-15。

示例:指針的工作方式

讓我們舉一個可行的實例。

#include <stdio.h>
int main()
{
   int* pc, c;
   
   c = 22;
   printf("c的地址: %p\n", &c);
   printf("c的值: %d\n\n", c);  // 22
   
   pc = &c;
   printf("指針pc地址: %p\n", pc);
   printf("指針pc內(nèi)容: %d\n\n", *pc); // 22
   
   c = 11;
   printf("指針pc地址: %p\n", pc);
   printf("指針pc內(nèi)容: %d\n\n", *pc); // 11
   
   *pc = 2;
   printf("c的地址: %p\n", &c);
   printf("c的值: %d\n\n", c); // 2
   return 0;
}

輸出結(jié)果

c的地址: 003FFBF8
c的值: 22

指針pc地址: 003FFBF8
指針pc內(nèi)容: 22

指針pc地址: 003FFBF8
指針pc內(nèi)容: 11

c的地址: 003FFBF8
c的值: 2

該程序的用法

  1. int* pc, c;
    將創(chuàng)建一個指針變量和一個普通變量。
    這里創(chuàng)建了一個指針pc和一個普通變量c,都是int類型。由于pc和c沒有初始化在最初,指針pc指向沒有地址或一個隨機地址。變量c有一個地址,但包含隨機的垃圾值。  

  2. c = 22;
    22被分配給變量c。
    這是給變量c賦值22,也就是說,22被存儲在變量c的內(nèi)存中。
     

  3. pc = &c;
    變量c的地址分配給指針pc。
    這將變量c的地址分配給指針pc。
     

  4. c = 11;
    11分配給變量c。
    這將11分配給變量c。
     

  5. *pc = 2;
    將5分配給指針變量的地址。
    這會將指針pc指向的內(nèi)存位置的值更改為2。

使用指針時的常見錯誤

假設(shè)您希望指針pc指向c的地址。 然后,

int c, *pc;

//pc是地址,但c不是
pc = c; // Error

//&c是地址,但* pc不是
*pc = &c; // Error

//&c和pc都是地址
pc = &c;

//c和*pc值
*pc = c;

這是指針語法初學者經(jīng)常會感到困惑的示例。

#include <stdio.h>
int main() {
   int c = 5;
   int *p = &c;

   printf("%d", *p);  // 5
   return 0; 
}

使用時為什么沒有出現(xiàn)錯誤int *p = &c;?

這是因為

int *p = &c;

相當于

int *p:
p = &c;

在這兩種情況下,我們都創(chuàng)建了一個指針p(不是*p)并給它賦值&c。

為了避免這種混亂,我們可以使用如下語句:

int* p = &c;

現(xiàn)在您知道了什么是指針,您將在下一個教程中學習指針與數(shù)組的關(guān)系。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清