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

C語(yǔ)言指針詳解及用法示例

 更新時(shí)間:2017年11月01日 14:14:26   作者:、起眼  
這篇文章主要介紹了C語(yǔ)言指針詳解及用法示例,介紹了其相關(guān)概念,然后分享了幾種用法,具有一定參考價(jià)值。需要的朋友可以了解下。

新手在C語(yǔ)言的學(xué)習(xí)過(guò)程中遇到的最頭疼的知識(shí)點(diǎn)應(yīng)該就是指針了,指針在C語(yǔ)言中有非常大的用處。下面我就帶著問(wèn)題來(lái)寫(xiě)下我對(duì)于指針的一些理解。

指針是什么? 

      指針本身是一個(gè)變量,它存儲(chǔ)的是數(shù)據(jù)在內(nèi)存中的地址而不是數(shù)據(jù)本身的值。它的定義如下:

 int a=10,*p;  
 p=&a
 int a=10;
 int *p=&a;

       首先我們可以理解 int* 這個(gè)是要定義一個(gè)指針p,然后因?yàn)檫@個(gè)指針存儲(chǔ)的是地址所以要對(duì)a取地址(&)將值賦給指針p,也就是說(shuō)這個(gè)指針p指向a。

      很多新手都會(huì)對(duì)這兩種定義方法感到迷惑,其實(shí)他倆的意思是一樣的。第一種定義方法定義了int型的變量a和指針p,然后將a的地址賦給p。第二種是在定義指針p的同時(shí)將a的地址賦給指針p。我們姑且理解為" int * "是定義指針的標(biāo)志。

指針有什么用?

   這樣我們就可以通過(guò)*p來(lái)找到指針?biāo)赶虻淖兞縜的地址,然后對(duì)地址中的值(值是10)進(jìn)行操作。

//接著上面的代碼

printf("%p",p)   //結(jié)果是一個(gè)地址(p指向的變量a的地址)。
printf("%d",*p)  //結(jié)果是10,變量a的值。
printf("%d",&p)  //結(jié)果是一個(gè)地址(指針p的地址,因?yàn)橹羔樢彩且粋€(gè)變量自己也有地址的)

數(shù)組名和指針的區(qū)別?

  數(shù)組名是一個(gè)地址,它可以被理解為一個(gè)常指針(它只能指向本數(shù)組首元素的地址)。而指針可以指其他的變量等等。

int str[5]={1,2,3,4,5};
int *p=str;
printf("%d",*p);  //輸出為1,數(shù)組的首元素。
printf("%d",*str); //輸出為1,數(shù)組的首元素。
printf("%d",str[0]); //輸出為1,數(shù)組的首元素。
printf("%p",p); //輸出為地址,數(shù)組的地址。
printf("%p",str); //輸出為地址,數(shù)組的地址。
printf("%d",*(p+1)); //輸出為2,數(shù)組的第二個(gè)元素。
printf("%d",*(srt+1)); //輸出為2,數(shù)組的第二個(gè)元素。

對(duì)照代碼大家可以很清晰的看到數(shù)組名在對(duì)內(nèi)存中存儲(chǔ)的數(shù)據(jù)進(jìn)行操作的方法和結(jié)果是一樣,但是數(shù)組名存儲(chǔ)自己數(shù)組本身的首地址。

什么是空指針,野指針?

      在函數(shù)內(nèi)部對(duì)指針進(jìn)行賦值操作后,在函數(shù)執(zhí)行完畢后,該指針就成了一個(gè)空指針(變量從棧中彈出)。但是通過(guò)動(dòng)態(tài)地址分配(堆空間)的指針不會(huì)有上述問(wèn)題。

        free(p)后釋放內(nèi)存的指針為野指針。

關(guān)于const對(duì)于指針的限制問(wèn)題

int a=10,b=20;
int * const p=&a;  //無(wú)法使p指向其他地址。
p=&b;          //這樣的操作是不允許的。
*p=20;          //可以這樣操作。

const int * p=&a;   //p可以指向其他地址。
p=&b;           //可以操作。
*p=10;           //操作不被允許。

const int * const p=&a  //p不能指向其他地址,也不能改變地址中的值。
p=&b;           //操作不被允許。
*p=20;           //操作不被允許。

       const在int的左邊那就是不能修改地址中的值,在右邊就是不能指向其他地址,左右都有那就是既不能修改地址的值也不能指向其他地址。 

       新手常出現(xiàn)的問(wèn)題我個(gè)人總結(jié)了上述幾點(diǎn),如果有錯(cuò)誤的地方希望大家留言交流互相學(xué)習(xí)。后面會(huì)寫(xiě)下多維數(shù)組的存儲(chǔ)方式和指針的問(wèn)題。

下面簡(jiǎn)單介紹下c語(yǔ)言指針的幾種用法。

1、指針指向變量:
下面有這樣一個(gè)代碼塊:

int main()
{int a=10;int b=15;test(a,b);printf("a=%d,b=%d\n",a,b);}
void test(int x,int y)
{int tmp;tmp=x;x=y;y=tmp;}

最后輸出的結(jié)果還是a=10,b=15。因?yàn)樵诤瘮?shù)調(diào)用時(shí),實(shí)參和形參之間只是值傳遞。但我們使用指針結(jié)果就不一樣了,如:

int main()
{int a=10;int b=15;test(&a,&b);printf("a=%d,b=%d\n",a,b);return 0;}
void test(int * x,int *y)
{int tmp;tmp=*x;*x=*y;*y=tmp;}

輸出結(jié)果a=15,b=10。變量a和b的值發(fā)生了交換。這是因?yàn)槲覀兝弥羔樤L問(wèn)變量的存儲(chǔ)單元,間接修改變量的值。

2、指針指向數(shù)組:

定義一個(gè)數(shù)組并初始化,int array[5]={2,5,12,7,8},定義一個(gè)指針變量并把數(shù)組的地址賦給它,int *p=array,注意數(shù)組名就是數(shù)組的地址,而且數(shù)組的地址就是首元素的地址。因此我們的指針變量就指向了數(shù)組的首元素,*p=2。如果把(p+1),那么指針變量就指向了數(shù)組的下一個(gè)元素5,因此我們可以利用指針來(lái)遍歷數(shù)組的各個(gè)元素:

int main()
{int array[5]={2,5,12,7,8};int *p =array;for(int i=0;i<5;i++){printf("array[%d]=%d\n",i,*(p+i));}return 0;}

3、指針指向字符串:

我們都知道用數(shù)組存儲(chǔ)字符串,如char name[20]="jack",上面已經(jīng)簡(jiǎn)單講述了指針指向數(shù)組,所以我們可以這樣做,char *name="jack",指針變量指向字符串的首個(gè)字符并可以依次訪問(wèn)字符串的各個(gè)字符。

4,指針指向函數(shù):

我們需要知道怎樣表示一個(gè)指針指向函數(shù),說(shuō)白了就是語(yǔ)法要正確,下面我也取一個(gè)代碼塊來(lái)說(shuō)明一下:

int sum(int x,int y)
{return x+y;}
int main()
{int a=5;int b=6;int (*p)(int,int);p=sum;int result=(*p)(a,b);printf("The result is %d\n",result);return 0;}

不難發(fā)現(xiàn)上面代碼塊里語(yǔ)句(*p)(a,b)可以用p(a,b)來(lái)代替,因?yàn)閜和sum就是一樣的,只是用前者可能更容易理解一點(diǎn)。而我們要知道怎樣定義一個(gè)指針指向函數(shù),int (*p)(int,int)這是固定寫(xiě)法,前面的int是指針將來(lái)指向的函數(shù)的返回值的類(lèi)型,如果沒(méi)有函數(shù)返回值,那就是void,后面括號(hào)里的兩個(gè)int 當(dāng)然就是指針將指向的函數(shù)的形參。指針指向函數(shù)用起來(lái)確實(shí)有點(diǎn)抽象,要想熟練運(yùn)用的話就多去做一些這方面的練習(xí)吧!

5,指針指向結(jié)構(gòu)體:

我們首先首先定義一個(gè)結(jié)構(gòu)類(lèi)型,

struct student
{
   char *name;
   int ages;
};

再根據(jù)類(lèi)型定義結(jié)構(gòu)體變量 struct student stu={"Rose",15};定義一個(gè)指針指向結(jié)構(gòu)體類(lèi)型,struct student *p;把結(jié)構(gòu)體變量stu的地址賦給指針變量p,p=&stu;我們可以有3種方式來(lái)訪問(wèn)結(jié)構(gòu)體中的屬性ages:

stu.ages=15;(*p).ages=15;p->ages=15;不過(guò)第三種方式在C語(yǔ)言中只能用來(lái)指向結(jié)構(gòu)體。

綜上所述,指針的基本用法就是這幾種,還有些用法不常見(jiàn)的小編在此就一一例舉了,有興趣的話可以去翻閱相關(guān)的資料。

總結(jié)

以上就是本文關(guān)于C語(yǔ)言指針詳解及用法示例的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • C語(yǔ)言中printf的兩種輸出對(duì)齊方式

    C語(yǔ)言中printf的兩種輸出對(duì)齊方式

    C語(yǔ)言中左對(duì)齊是C語(yǔ)言的默認(rèn)輸出方式,右對(duì)齊是一種特殊的輸出方式,左對(duì)齊和右對(duì)齊都對(duì)應(yīng)著一個(gè)已知的輸出寬度,輸出的字符串根據(jù)字符串的長(zhǎng)度在寬度上進(jìn)行補(bǔ)充,補(bǔ)充字符是空格,在使用printf函數(shù)輸出時(shí),需要在格式字符串中使用%-*s和%*s的格式來(lái)分別表示
    2024-02-02
  • C++數(shù)據(jù)結(jié)構(gòu)之二叉搜索樹(shù)的實(shí)現(xiàn)詳解

    C++數(shù)據(jù)結(jié)構(gòu)之二叉搜索樹(shù)的實(shí)現(xiàn)詳解

    二叉搜索樹(shù)作為一個(gè)經(jīng)典的數(shù)據(jù)結(jié)構(gòu),具有鏈表的快速插入與刪除的特點(diǎn),同時(shí)查詢(xún)效率也很優(yōu)秀,所以應(yīng)用十分廣泛。本文將詳細(xì)講講二叉搜索樹(shù)的C++實(shí)現(xiàn),需要的可以參考一下
    2022-08-08
  • 淺析內(nèi)存對(duì)齊與ANSI C中struct型數(shù)據(jù)的內(nèi)存布局

    淺析內(nèi)存對(duì)齊與ANSI C中struct型數(shù)據(jù)的內(nèi)存布局

    當(dāng)在C中定義了一個(gè)結(jié)構(gòu)類(lèi)型時(shí),它的大小是否等于各字段(field)大小之和?編譯器將如何在內(nèi)存中放置這些字段?ANSI C對(duì)結(jié)構(gòu)體的內(nèi)存布局有什么要求?而我們的程序又能否依賴(lài)這種布局
    2013-09-09
  • 詳解如何用c++實(shí)現(xiàn)平衡二叉樹(shù)

    詳解如何用c++實(shí)現(xiàn)平衡二叉樹(shù)

    平衡二叉樹(shù)(Balanced Binary Tree)又被稱(chēng)為AVL樹(shù)(有別于AVL算法),由前蘇聯(lián)的數(shù)學(xué)家Adelse-Velskil和Landis在1962年提出的高度平衡的二叉樹(shù),根據(jù)科學(xué)家的英文名也稱(chēng)為AVL樹(shù)。本文介紹了它的原理和如何用C++代碼來(lái)實(shí)現(xiàn)
    2021-06-06
  • C++ 數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)(前序/中序/后序遞歸、非遞歸遍歷)

    C++ 數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)(前序/中序/后序遞歸、非遞歸遍歷)

    這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)(前序/中序/后序遞歸、非遞歸遍歷)的相關(guān)資料,這里提供實(shí)例代碼來(lái)幫助大家理解掌握二叉樹(shù),需要的朋友可以參考下
    2017-07-07
  • C++順序表的實(shí)例代碼

    C++順序表的實(shí)例代碼

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)順序表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)單的掃雷小游戲

    C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)單的掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)單的掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • C++按位異或運(yùn)算符的使用介紹

    C++按位異或運(yùn)算符的使用介紹

    本篇文章對(duì)C++按位異或運(yùn)算符的使用進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • 詳解PID控制器原理

    詳解PID控制器原理

    什么是 PID?它是一種在編程中使用的基本方法,如果正確調(diào)整,可以令人難以置信的有效和準(zhǔn)確,PID代表比例積分微分,3個(gè)單獨(dú)的部分連接在一起,雖然有時(shí)你不需要三個(gè)都使用。例如,您可以改為有P控制,PI控制或PD控制
    2021-06-06
  • TypeScript的函數(shù)定義與使用案例教程

    TypeScript的函數(shù)定義與使用案例教程

    這篇文章主要介紹了TypeScript的函數(shù)定義與使用案例教程,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評(píng)論

阿城市| 扎囊县| 华阴市| 江都市| 三河市| 营口市| 淮阳县| 额济纳旗| 雷波县| 青浦区| 高平市| 冕宁县| 长治市| 松江区| 溧水县| 兴隆县| 绥宁县| 龙陵县| 富川| 孝昌县| 仁寿县| 云梦县| 锦州市| 屯留县| 平陆县| 班玛县| 托里县| 黑山县| 延安市| 扬中市| 五华县| 新巴尔虎右旗| 乌拉特前旗| 崇左市| 贵溪市| 正蓝旗| 红原县| 富平县| 高安市| 册亨县| 汉阴县|