目錄
零基礎 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 = 10;
int *pValue = &iValue;
printf("整形變量iValue值:%d 整形變量iValue內存地址:%p\n", iValue,&iValue);
printf("整形指針變量pValue值:%d 整形指針變量pValue內存地址:%p\n", *pValue, pValue);
printf("-------------------------------------------------------\n");
*pValue = 20;
printf("整形變量iValue值:%d 整形變量iValue內存地址:%p\n", iValue, &iValue);
printf("整形指針變量pValue值:%d 整形指針變量pValue內存地址:%p\n", *pValue, pValue);
printf("-------------------------------------------------------\n");
iValue = 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 語言 指針聲明和定義
本文由博客 - 猿說編程 猿說編程 發布!
