指針指向另一個值的內存地址。
指針引用內存中的位置,并獲取存儲在該位置的值稱為取消引用指針(來源:http://en.wikipedia.org/wiki/Pointer_(computer_programming))。
看下面的語句:
int number = 5;
分配一個內存位置來存儲值為5的整數,您可以使用名稱編號訪問它。
值5存儲在該區(qū)域中。
計算機使用地址引用該區(qū)域。
假設地址是101。我們可以說把價值5放入房間號101;
可以存儲地址的變量稱為指針。
下面的代碼定義了一個指針 number
其中包含另一個變量的地址,稱為number,它是一個包含值5的整數變量。
存儲在數字中的值是地址的第一個字節(jié)數。
字指針用于僅指一個地址。
int number = 5; int *pnumber = &number;
指向char類型的值的指針指向占用1個字節(jié)的值,而指針到類型long的值通常指向占用4個字節(jié)的值的第一個字節(jié)。
每個指針將與特定的變量類型相關聯,并且它只能用于指向該類型的變量。
因此,類型“指向int的指針"的指針只能指向int類型的變量,“指向浮點型"指針的指針只能指向float類型的變量,等等。
通常,給定類型的指針對于任何給定的類型名稱類型寫為*。
類型名稱void表示不存在任何類型,因此類型為void *的指針可以包含數據的地址任何類型的項目。
類型void *通常用作具有處理數據的函數的參數類型或返回值類型以類型無關的方式。
任何類型的指針可以作為類型void *的值傳遞,然后轉換為適當類型使用時。
類型為int的變量的地址可以存儲在指針變量中例如,類型為void *。
當你想訪問存儲在void *指針中的地址的整數值時,你必須首先將指針轉換為int *類型。
您可以使用以下語句聲明指向int類型的變量的指針:
int *pnumber;
具有名稱number的變量的類型為int *。
它可以存儲int類型的任何變量的地址。
注意,你也可以寫這樣的語句:
int* pnumber;
語句只是創(chuàng)建pnumber變量,但不會初始化它。
你可以初始化pnumber,使它不會通過重寫聲明來指向任何東西喜歡這個:
int *pnumber = NULL;
NULL是在標準庫中定義的常量,并且對于指針等效于零。
NULL是一個值,不能指向內存中的任何位置。
如果要使用變量的地址初始化變量pnumber你已經聲明,你使用運算符的地址&:
int number = 5; int *pnumber = &number;
現在,number的初始值是變量的地址。
您可以在中聲明常規(guī)變量和指針同樣的語句,例如:
double value, *pVal, fnum;
此語句聲明兩個雙精度浮點變量,值和fnum,以及變量pVal類型“指針加倍。
為了獲得變量的內存地址,我們可以使用& 句法。
#include <stdio.h>
int main(int argc, const char* argv[]) {
int n;
n = 10;
printf("value n: %d \n",n);
printf("address n: %x \n",&n);
return 0;
}
上面的代碼生成以下結果。
要聲明一個特定數據類型的指針,我們可以使用 *
語法。
此變量由我們的指針變量的內存地址。
#include <stdio.h>
int main(int argc, const char* argv[]) {
int n;
int* nPtr;
n = 10;
nPtr = &n;
printf("value n: %d \n",n);
printf("address n: %x \n",(unsigned int)&n);
printf("value nPtr: %x \n",(unsigned int)nPtr);
printf("address nPtr: %x \n",(unsigned int)&nPtr);
printf("value pointer nPtr: %d \n",*nPtr);
return 0;
}
你可以看到nPtr的值是變量n的內存地址。
如果n設置為10,那么指針nPtr的值,我們聲明為* nPtr是與變量n的值相同的值。
上面的代碼生成以下結果。
使用間接運算符*來訪問指針指向的變量的值。
這個操作符也是稱為解引用運算符,因為您使用它來“解引用"指針。
假設您聲明以下變量:
int number = 15; int *pointer = &number; int result = 0;
指針變量包含變量號的地址,因此可以在表達式中使用此變量計算結果的新值,如下所示:
result = *pointer + 5;
表達式*指針將計算存儲在指針中包含的地址處的值。
這是值存儲在數字,15,因此結果將設置為15 + 5,這是20。
下面的代碼聲明一個變量和一個指針,然后輸出它們的地址和值。
#include <stdio.h>
int main(void)
{
int number = 0; // A variable of type int initialized to 0
int *pnumber = NULL; // A pointer that can point to type int
number = 5;
printf("number"s address: %p\n", &number); // Output the address
printf("number"s value: %d\n\n", number); // Output the value
pnumber = &number; // Store the address of number in pnumber
printf("pnumber"s address: %p\n", (void*)&pnumber); // Output the address
printf("pnumber"s size: %zd bytes\n", sizeof(pnumber)); // Output the size
printf("pnumber"s value: %p\n", pnumber); // Output the value (an address)
printf("value pointed to: %d\n", *pnumber); // Value at the address
return 0;
}
上面的代碼生成以下結果。
因為您可以通過指針pnumber訪問數字的內容,您可以在算術語句中使用取消引用的數值類型的指針。
例如:
*pnumber += 5;
此語句將當前所有地址變量pnumber的值遞增5。
*表示正在訪問名為pnumber的變量所指向的內容。
變量pnumber可以存儲int類型的任何變量的地址。
這意味著您可以將pnumber指向的變量更改為:
int value = 9; pnumber = &value;
假設您重復以前使用的相同語句:
*pnumber += 5;
語句將使用新的變量,值操作,因此值的新內容將為14。
指針可以包含適當類型的任何變量的地址,因此可以使用一個指針變量來更改值許多不同的變量,只要它們的“re"類型與指針類型兼容即可。
此示例使用指針修改存儲在一些其他變量中的值。
#include <stdio.h>
int main(void)
{
long num1 = 1L;
long num2 = 1L;
long *pnum = NULL;
pnum = &num1; // Get address of num1
*pnum = 2L; // Set num1 to 2
++num2; // Increment num2
num2 += *pnum; // Add num1 to num2
printf("num1 = %ld num2 = %ld *pnum = %ld *pnum + num2 = %ld\n",
num1, num2, *pnum, *pnum + num2);
return 0;
}
上面的代碼生成以下結果。
以下代碼顯示了如何在 scanf
函數中使用指針變量。
當您使用scanf()輸入值時,您已經使用&運算符來獲取要接收輸入的變量的地址。
當你有一個指針時,可以使用指針名稱作為參數。
#include <stdio.h>
int main(void)
{
int value = 0;
int *pvalue = &value; // Set pointer to refer to value
printf ("Input an integer: ");
scanf(" %d", pvalue); // Read into value via the pointer
printf("You entered %d.\n", value); // Output the value entered
return 0;
}
上面的代碼生成以下結果。
更多建議: