最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中的指針初階詳解

 更新時間:2025年04月27日 09:29:47   作者:s_little_monster_  
這篇文章主要介紹了C語言中的指針初階,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

一、指針的解釋

通俗來講就是某一數(shù)據(jù)的位置。因為數(shù)據(jù)的存儲是需要空間的,這個空間會有一個地址,指針就是用來存放這個地址的,以便于后續(xù)快速的訪問

二、指針變量和地址

1、取地址操作符

在C語言中創(chuàng)建變量就是向內(nèi)存申請空間

#include <stdio.h>
int main()
{
 int a = 10;
 return 0;
}

我們在內(nèi)存里可以看到在創(chuàng)建變量a的時候申請了一塊空間

我們?nèi)〉刂穉之后將地址四行顯示,發(fā)現(xiàn)a存儲在了這個地址里,0a就是十六進(jìn)制下的10

這里我們介紹一下我們的老朋友,&操作符。在以前的學(xué)習(xí)中,我們在學(xué)習(xí)scanf函數(shù)的時候接觸過這個操作符,這個操作符就叫做取地址操作符。

&a取出的是a所占的四個字節(jié)中地址最小的字節(jié)的地址,通過計算機(jī)的一套算法,它懂得這個數(shù)據(jù)是整形,會取出剩下的三個地址

(這時候我們對scanf函數(shù)的理解也會深一個層次

scanf("%d",&a);

這里的&a就是取出a的地址,將里邊的值進(jìn)行修改)

2、指針變量和解引用操作

1、指針變量

那我們通過取地址操作符(&)拿到的地址是?個數(shù)值,這個數(shù)值有時候需要存儲起來,?便后期再使?,我們會把這樣的地址值存放在指針變量中。

#include <stido.h>
int main()
{
    int a = 10;
    int *pa = &a;//這樣就把取出的a的地址存放到指針pa中了
    return 0;
}

指針變量也是變量,專門用來存放地址,存放在其中的值都會被認(rèn)為是地址

2、拆解指針類型

    int a = 10;
    int *pa = &a;

*說明pa是指針變量,int 說明pa這個指針變量指向的是一個int類型也就是整型類型的對象

當(dāng)然如果是short類型的對象那么就

short i = 10;
short *pi = &i;

char類型那么就

char j = 10;
char * pj = &j;

3、解引用操作符

#include <stido.h>
int main()
{
    int a = 10;
    int *pa = &a;
    *pa = 20;
    return 0;
}

這樣就把a(bǔ)的值更改為20了

4、注意事項

int*pa
int *pa
int* pa
int * pa

這幾個是一樣的,表達(dá)上沒有任何的區(qū)別

3、指針變量的大小

#include <stdio.h>
int main()
{
 printf("%zd\n", sizeof(char *));
 printf("%zd\n", sizeof(short *));
 printf("%zd\n", sizeof(int *));
 printf("%zd\n", sizeof(double *));
 return 0;
}

指針變量的大小取決于地址的大小,指針變量的大小和類型是無關(guān),只要指針類型的變量在相同的平臺下,大小都是相同的

4、指針的解引用

#include <stdio.h>
int main()
{
 int n = 0x12345678;
 int *pi = &n; 
 *pi = 0; 
 printf("%d",n):
 return 0;
}
#include <stdio.h>
int main()
{
 int n = 0x12345678;
 char *pi =(char*) &n; //強(qiáng)制轉(zhuǎn)化,不然是不可以用char類型的指針來接受int類型的變量的
 *pi = 0; 
 printf("%d",n);
 return 0;
}
  • 第一個運(yùn)行結(jié)果

  • 第二個的運(yùn)行結(jié)果

這說明char類型和int類型的訪問權(quán)限不同,char類型可以訪問一個字節(jié),也就是十六進(jìn)制下的兩位數(shù),int類型可以訪問四個字節(jié),也就是十六進(jìn)制下的八位數(shù)

5、void*指針

無具體類型的指針,也叫泛型指針,可以接受任何類型的地址但它不能夠進(jìn)行解引用操作,以及指針±整數(shù)的運(yùn)算(下面來說)

三、指針的運(yùn)算

1、指針±整數(shù)

#include <stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = &arr[0];
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));//p+i 這?就是指針+整數(shù)
	}
	return 0;
}

這里的指針經(jīng)過加減后是通過單位進(jìn)行訪問的,也就是如果是int類型,那么指針就加了四個字節(jié),char加一個字節(jié),short加兩個字節(jié)。

2、指針 - 指針

#include <stdio.h>
int my_strlen(char* s)
{
	char* p = s;
	while (*p != '\0')// \0 之前的元素為字符串中的元素
		p++;
	return p - s;
}
int main()
{
	printf("%d\n", my_strlen("abc"));
	return 0;
}

這樣就可以算出字符串中的元素個數(shù)

3、指針的關(guān)系運(yùn)算

#include <stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = &arr[0];
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	while (p < arr + sz) //指針的???較
	{
		printf("%d ", *p);
		p++;
	}
	return 0;
}

四、野指針

1、野指針形成的原因

#include <stdio.h>
int main()
{
	int* p;//局部變量指針未初始化,默認(rèn)為隨機(jī)值
	*p = 20;
	return 0;
}

2、指針越界訪問

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	int* p = &arr[0];
	int i = 0;
	for (i = 0; i <= 11; i++)
	{
		//當(dāng)指針指向的范圍超出數(shù)組arr的范圍時,p就是野指針
		*(p++) = i;
	}
	return 0;
}

3、指針指向的空間釋放

#include <stdio.h>
int* test()
{
	int n = 100;
	return &n;
}
int main()
{
	int* p = test();
	printf("%d\n", *p);
	return 0;
}

這些原因其實都很常見,也很有規(guī)矩,看一下就能看出來是理所應(yīng)當(dāng)?shù)?,沒啥需要解釋的

想辦法規(guī)避它們就行了

五、const 修飾指針

1、const修飾變量

#include <stdio.h>
int main()
{
	int m = 0;
	m = 20;//m是可以修改的
	const int n = 0;
	n = 20;//n是不能被修改的
	return 0;
}

被const修飾的變量是不能修改的

2、const修飾指針變量

int * p;//沒有const修飾
const int * p;//const 放在*的左邊做修飾
int const * p;//const 放在*的左邊做修飾
int * const p;//const 放在*的右邊做修飾

第二行和第三行實際是一樣的。

我的理解是看const修飾的量,被其修飾的量是不能改變的,我們先來看第二行和第三行代碼,*p不能改變,*p是變量值,也就是指針指向的那個變量的內(nèi)容,它是不能夠改變的,但p也就是地址,指針本身,是可以改變的。

第四行代碼,const修飾p,地址,指針本身,是不能改變的,但指針指向的變量的內(nèi)容是不能改變的

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++項目中使用.dll 和.def 文件的操作指南

    C++項目中使用.dll 和.def 文件的操作指南

    在 C++ 項目中,當(dāng)我們只有 sqlite3.dll 和 .def 文件,但沒有 .lib 文件時,通常需要生成 .lib 文件以便項目鏈接或直接調(diào)用 sqlite3.dll,本文將介紹幾種方法來生成 .lib 文件,或者在不生成 .lib 文件的情況下直接調(diào)用 sqlite3.dll,需要的朋友可以參考下
    2025-07-07
  • C++指針學(xué)習(xí)詳解

    C++指針學(xué)習(xí)詳解

    指針在 C\C++ 語言中是很重要的內(nèi)容,并且和指針有關(guān)的內(nèi)容一向令初學(xué)者頭大,這篇文章主要給大家介紹了關(guān)于C/C++中指針的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • C語言實現(xiàn)模擬銀行系統(tǒng)

    C語言實現(xiàn)模擬銀行系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)模擬銀行系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 在Visual Studio Code中配置C++編譯環(huán)境的問題

    在Visual Studio Code中配置C++編譯環(huán)境的問題

    關(guān)于Visual Studio Code對C++環(huán)境的配置方法應(yīng)該有好多種,我這里用到了其中的兩種,具體內(nèi)容詳情文中給大家詳細(xì)介紹,對Visual Studio Code配置C++編譯環(huán)境相關(guān)知識感興趣的朋友一起看看吧
    2021-07-07
  • C++面經(jīng)之什么是RAII面試問題解析

    C++面經(jīng)之什么是RAII面試問題解析

    這篇文章主要介紹了C++面經(jīng)之什么是RAII面試問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • CFile與CStdioFile的文件讀寫使用方法詳解

    CFile與CStdioFile的文件讀寫使用方法詳解

    以下是對CFile與CStdioFile的文件讀寫使用方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • Qt4和Qt5的信號和槽的使用區(qū)別

    Qt4和Qt5的信號和槽的使用區(qū)別

    本文主要介紹了Qt4 和 Qt5 的信號和槽的連接 connect 與斷開 disconnect 區(qū)別,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語言詳細(xì)分析宏定義與預(yù)處理命令的應(yīng)用

    C語言詳細(xì)分析宏定義與預(yù)處理命令的應(yīng)用

    宏定義是用宏名來表示一個字符串,在宏展開時又以該字符串取代宏名,這只是一種簡單的替換。字符串中可以含任何字符,可以是常數(shù),也可以是表達(dá)式,預(yù)處理程序?qū)λ蛔魅魏螜z查,如有錯誤,只能在編譯已被宏展開后的源程序時發(fā)現(xiàn)
    2022-07-07
  • c++中#include &lt;&gt;與#include""的區(qū)別詳細(xì)解析

    c++中#include &lt;&gt;與#include""的區(qū)別詳細(xì)解析

    <>先去系統(tǒng)目錄中找頭文件,如果沒有在到當(dāng)前目錄下找。所以像標(biāo)準(zhǔn)的頭文件 stdio.h、stdlib.h等用這個方法
    2013-10-10
  • 基于MFC實現(xiàn)貪吃蛇小游戲

    基于MFC實現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了基于MFC實現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評論

忻州市| 西盟| 宁晋县| 南丰县| 苍山县| 北京市| 云梦县| 柳江县| 怀安县| 兰坪| 望江县| 平武县| 安仁县| 广昌县| 锦州市| 安顺市| 松滋市| 东城区| 阳信县| 景泰县| 永兴县| 蒲江县| 来宾市| 罗山县| 沾益县| 文化| 三门县| 尖扎县| 岚皋县| 会昌县| 建宁县| 永泰县| 鹰潭市| 兴义市| 阜阳市| 北辰区| 贵州省| 鄂伦春自治旗| 绥德县| 昌平区| 庆元县|