目錄
- 一.指標簡介
- 1.記憶體
- 2.記憶體地址
- 3.指標宣告
- 二.指標型別
- 三.宣告并初始化一個指標
- 1.宣告指標并直接初始化 – 推薦
- 2.先宣告指標在初始化 – 不推薦
- 四.查看指標地址和指標的值
- 五.NULL 指標 – 空指標
- 六.重點總結
- 七.猜你喜歡
零基礎 C/C++ 學習路線推薦 : C/C++ 學習目錄 >> C 語言基礎入門
一.指標簡介
指標和陣列是 C 語言的靈魂,關于陣列,前面我們已經介紹完了,在講解指標之前,需要明白三個概念:記憶體 / 記憶體地址 / 指標;
1.記憶體
C 語言所有變數都存放在記憶體中,就好比杯子里的水,水就是變數,杯子就是記憶體,記憶體作為容器用來存放變數;
2.記憶體地址
記憶體地址就好比一個人除了有名字之后外還有身份證,每個人的身份證都是唯一的,記憶體地址也是唯一的,如何查看記憶體地址,下面的文章也有有講解;
3.指標宣告
指標也是 C 語言中變數的一種,其值為一個變數的地址,即記憶體位置的直接地址,指標變數宣告的一般形式為:
/*
type:指標型別,它必須是一個有效的 C 資料型別,例如:int / float / double / char .....
var-name : 指標變數的名稱
*/
type *var-name;
注意:不要忘記在指標型別和變數名中間還有一個 * 號,沒有這個 * 號,只是定義了一個普通變數,這也是普通變數宣告和指標宣告的區別之一;
int *p; /* 一個整型的指標 */
int p; /* 一個整型的變數 */
二.指標型別
指標很靈活,它可以指向任意型別的資料,指標的型別說明了它所指向地址空間的記憶體,以下是有效的指標宣告:
int *p; /* 一個整型的指標 */
double *p; /* 一個 double 型的指標 */
float *p; /* 一個浮點型的指標 */
char *p; /* 一個字符型的指標 */
注意:不要忘記在指標型別和變數名中間還有一個 * 號,沒有這個 * 號,只是定義了一個普通變數,這也是普通變數宣告和指標宣告的區別之一;
三.宣告并初始化一個指標
1.宣告指標并直接初始化 – 推薦
int *p = 10; //宣告一個int型別的指標指向變數為10的記憶體地址
double *p = 10.55; //宣告一個double型別的指標指向變數為10.55的記憶體地址
float *p = 10.0; //宣告一個float型別的指標指向變數為10.0的記憶體地址
char *p = "123456"; //宣告一個char型別的指標指向變數為"123456"的記憶體地址
2.先宣告指標在初始化 – 不推薦
C 語言中,定義區域變數時如果未初始化,則值是隨機的;全域變數 、靜態變數初始值為 0 ;
四.查看指標地址和指標的值
在文章 格式控制符/占位符 中已經介紹了不少占位符,而對于指標的占位符則是用 %p 或者 %x 表示,具體使用參考下面例子:
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 指標宣告和定義
//@Time:2021/06/12 08:00
//@Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!
/******************************************************************************************/
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
int main()
{
int iValue = https://www.cnblogs.com/shuopython/p/10;
int *pValue = &iValue;
printf("整形變數iValue值:%d 整形變數iValue記憶體地址:%p\n", iValue,&iValue);
printf("整形指標變數pValue值:%d 整形指標變數pValue記憶體地址:%p\n", *pValue, pValue);
printf("-------------------------------------------------------\n");
*pValue = https://www.cnblogs.com/shuopython/p/20;
printf("整形變數iValue值:%d 整形變數iValue記憶體地址:%p\n", iValue, &iValue);
printf("整形指標變數pValue值:%d 整形指標變數pValue記憶體地址:%p\n", *pValue, pValue);
printf("-------------------------------------------------------\n");
iValue = https://www.cnblogs.com/shuopython/p/30;
printf("整形變數iValue值:%d 整形變數iValue記憶體地址:%p\n", iValue, &iValue);
printf("整形指標變數pValue值:%d 整形指標變數pValue記憶體地址:%p\n", *pValue, pValue);
system("pause");
return 0;
}
/*
輸出結果:
整形變數iValue值:10 整形變數iValue記憶體地址:004FF798
整形指標變數pValue值:10 整形指標變數pValue記憶體地址:004FF798
-------------------------------------------------------
整形變數iValue值:20 整形變數iValue記憶體地址:004FF798
整形指標變數pValue值:20 整形指標變數pValue記憶體地址:004FF798
-------------------------------------------------------
整形變數iValue值:30 整形變數iValue記憶體地址:004FF798
整形指標變數pValue值:30 整形指標變數pValue記憶體地址:004FF798
請按任意鍵繼續. . .
*/
在上面例子中:宣告了一個整形變數 iValue ,并使用指標 pValue 執行整形變數 iValue ,根據輸出的資訊可以得到結論:兩者的記憶體地址都一樣;
由于整形變數 iValue 指標變數 pValue 記憶體地址一樣,整形變數 iValue 的值發生變化后指標 pValue 也會跟著一起變化,指標 pValue 的值發生變化后整形變數 iValue 的值也會跟著一起變化,兩者本來就是同一個, 就好比既可以通過名字找到你,也可以通過身份證號碼找到你;
五.NULL 指標 – 空指標
在變數宣告的時候,如果沒有確切的地址可以賦值,為指標變數賦一個 NULL 值,賦為 NULL 值的指標被稱為空指標,
NULL 指標是一個定義在標準庫中的值為零的常量,請看下面的程式:
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 指標宣告和定義
//@Time:2021/06/12 08:00
//@Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!
/******************************************************************************************/
#include <stdio.h>
int main ()
{
int *ptr = NULL;
printf("ptr 的地址是 %p\n", ptr );
return 0;
}
//輸出:ptr 的地址是 0x0
在大多數的作業系統上,程式不允許訪問地址為 0 的記憶體,因為該記憶體是作業系統保留的,然而,記憶體地址 0 有特別重要的意義,它表明該指標不指向一個可訪問的記憶體位置,但按照慣例,如果指標包含空值(零值),則假定它不指向任何東西,
如需檢查一個空指標,您可以使用 if 陳述句,如下所示:
if(ptr) /* 如果 p 非空,則完成 */
{
//....
}
if(!ptr) /* 如果 p 為空,則完成 */
{
//....
}
六.重點總結
指標作為一個變數,肯定有自己的地址,占位符使用 %p 或者 %x;
int *p = 10;
printf(" p : %p",p);// 輸出地址:004FF798
指標作為一個變數,肯定有自己的值,占位符使用 %d ,取指標的值需要在指標變數前面加上 * ,否則是取指標的地址,例如:
int *p = 10;
printf(" p : %d",*p);// 輸出值: 10
printf(" p : %p",p); // 輸出地址:004FF798
指標很靈活,它可以指向任意型別的資料,指標的型別說明了它所指向地址空間的記憶體
七.猜你喜歡
- 安裝 Visual Studio
- 安裝 Visual Studio 插件 Visual Assist
- Visual Studio 2008 卸載
- Visual Studio 2003/2015 卸載
- C 語言格式控制符/占位符
- C 語言邏輯運算子
- C 語言三目運算子
- C 語言逗號運算式
- C 語言 sizeof 和 strlen 函式區別
- C 語言 strcpy 和 strcpy_s 函式區別
- C 語言 memcpy 和 memcpy_s 區別
- C 語言 陣列定義和使用
- C 語言 陣列遍歷
- C 語言 陣列排序 – 冒泡法排序
- C 語言 陣列排序 – 選擇法排序
- C 語言 陣列排序 – 插入法排序
- C 語言 陣列排序 – 快速法排序
- C 語言 陣列下標越界
- C 語言 陣列記憶體溢位
- C 語言 陣列下標越界和記憶體溢位區別
- C 語言 陣列長度計算
- C 語言 指標宣告和定義
未經允許不得轉載:猿說編程 ? C 語言 指標宣告和定義
本文由博客 - 猿說編程 猿說編程 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/295933.html
標籤:C
