溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c語言指針動態(tài)、分布與列表該如何理解

發(fā)布時間:2022-01-07 21:52:58 來源:億速云 閱讀:162 作者:柒染 欄目:編程語言

c語言指針動態(tài)、分布與列表該如何理解,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

指針是c語言中一個非常重要的概念,也是c語言的特色之一。使用指針可以對復雜數(shù)據(jù)進行處理,能對計算機的內(nèi)存分配進行控制,在函數(shù)調(diào)用中使用指針還可以返回多個值。

指針、引用和取值

指針是一個存儲計算機內(nèi)存地址的變量。從指針指向的內(nèi)存讀取數(shù)據(jù)稱作指針的取值。指針可以指向某些具體類型的變量地址,例如int、long和double。指針也可以是void類型、NULL指針和未初始化指針。

指針和數(shù)組

數(shù)組表示一段連續(xù)的內(nèi)存空間,用來存儲多個特定類型的對象。與之相反,指針用來存儲單個內(nèi)存地址。數(shù)組和指針不是同一種結(jié)構(gòu)因此不可以互相轉(zhuǎn)換。

一個數(shù)組變量是一個常量。即使指針變量指向同樣的地址或者一個不同的數(shù)組,也不能把指針賦值給數(shù)組變量。也不可以將一個數(shù)組變量賦值給另一個數(shù)組。然而,可以把一個數(shù)組變量賦值給指針,這一點似乎讓人感到費解。把數(shù)組變量賦值給指針時,實際上是把指向數(shù)組第一個元素的地址賦給指針。

指針與結(jié)構(gòu)體

就像數(shù)組一樣,指向結(jié)構(gòu)體的指針存儲了結(jié)構(gòu)體第一個元素的內(nèi)存地址。與數(shù)組指針一樣,結(jié)構(gòu)體的指針必須聲明和結(jié)構(gòu)體類型保持一致,或者聲明為void類型。

需要注意兩個不同的符號,‘.’和‘->’。結(jié)構(gòu)體實例可以通過使用‘.’符號訪問age變量。對于結(jié)構(gòu)體實例的指針,我們可以通過‘->’符號訪問name變量,也可以同樣通過(*ptr).name來訪問name變量。

動態(tài)內(nèi)存分配

所謂動態(tài)內(nèi)存分配就是指在程序執(zhí)行的過程中動態(tài)地分配或者回收存儲空間的分配內(nèi)存的方法。動態(tài)內(nèi)存分配不象數(shù)組等靜態(tài)內(nèi)存分配方法那樣需要預先分配存儲空間,而是由系統(tǒng)根據(jù)程序的需要即時分配,且分配的大小就是程序要求的大小。

動態(tài)分配:程序在執(zhí)行時調(diào)用malloc庫函數(shù)申請分配。

動態(tài)內(nèi)存分配可以靈活地處理未知數(shù)目的。動態(tài)對象是沒有名字的變量,需要通過指針間接地對它進行操作。動態(tài)對象的分配與釋放必須由程序員顯式地管理,它通過malloc()和free()兩個函數(shù)(C++中為new和delete運算符)來完成。

以下是采用動態(tài)分配方式的例子:

p1=(char *)malloc(10*sizeof(int));

1.malloc函數(shù)

malloc函數(shù)的原型為:void *malloc(unsigned int size)
其作用是在內(nèi)存的動態(tài)存儲區(qū)中分配一個長度為size的連續(xù)空間。其參數(shù)是一個無符號×××數(shù),返回值是一個指向所分配的連續(xù)存儲域的起始地址的指針。還有一點必須注意的是,當函數(shù)未能成功分配存儲空間(如內(nèi)存不足)就會返回一個NULL指針。所以在調(diào)用該函數(shù)時應該檢測返回值是否為NULL并執(zhí)行相應的操作。
下例是一個動態(tài)分配的程序:

#include<stdio.h>

#include <stdio.h>

#include <conio.h>

#include <string.h>

#include <stdlib.h>

main()

{

int count,*array; /*count是一個計數(shù)器,array是一個整型指針,也可以理解為指向一個整型數(shù)組的首地址*/

if((array=(int *) malloc(10*sizeof(int)))==NULL)

{

     printf("不能成功分配存儲空間。");

     exit(1);

    }

    for(count=0;count<10;count++)/*給數(shù)組賦值*/

       array[count]=count;

    for(count=0;count<10;count++)/*打印數(shù)組元素*/

       printf("%d-",array[count]);

}

上例中動態(tài)分配了10個整型存儲區(qū)域,然后進行賦值并打印。例中if((array=(int *)malloc(10*sizeof(int)))==NULL)語句可以分為以下幾步:
1)分配10個整型的連續(xù)存儲空間,并返回一個指向其起始地址的整型指針
2)把此整型指針地址賦給array
3)檢測返回值是否為NULL
2.free函數(shù)

由于內(nèi)存區(qū)域總是有限的,不能不限制地分配下去,而且一個程序要盡量節(jié)省資源,所以當所分配的內(nèi)存區(qū)域不用時,就要釋放它,以便其它的變量或者程序使用。這時我們就要用到free函數(shù)。
其函數(shù)原型是:void free(void *p)
作用是釋放指針p所指向的內(nèi)存區(qū)。
其參數(shù)p必須是先前調(diào)用malloc函數(shù)或calloc函數(shù)(另一個動態(tài)分配存儲區(qū)域的函數(shù))時返回的指針。給free函數(shù)傳遞其它的值很可能造成死機或其它災難性的后果。
注意:這里重要的是指針的值,而不是用來申請動態(tài)內(nèi)存的指針本身。例:
int *p1,*p2;
p1=malloc(10*sizeof(int));
p2=p1;
……
free(p1)/*或者free(p2)*/
malloc返回值賦給p1,又把p1的值賦給p2,所以此時p1,p2都可作為free函數(shù)的參數(shù)。
malloc函數(shù)是對存儲區(qū)域進行分配的。
free函數(shù)是釋放已經(jīng)不用的內(nèi)存區(qū)域的。
所以由這兩個函數(shù)就可以實現(xiàn)對內(nèi)存區(qū)域進行動態(tài)分配并進行簡單的管理了。

鏈表

鏈表由一系列不必在內(nèi)存中相連的結(jié)構(gòu)組成。每一個結(jié)構(gòu)均含有表元素和指向包含該元素后繼元的結(jié)構(gòu)指針。我們稱之為next指針。最后一個單元的next指針指向NULL;該值由C定義并且不能與其它指針混淆。ANSI C規(guī)定NULL為零。

指針變量是包含存儲另外某個數(shù)據(jù)的地址的變量。因此,如果P被聲明為指向一個結(jié)構(gòu)的指針,那么存儲在P中的值就被解釋為內(nèi)存中的一個位置,在該位置能夠找到一個結(jié)構(gòu)。 

typedef struct node

{

char name[20];

struct node *link;

}stud;

這樣就定義了一個單鏈表的結(jié)構(gòu),其中char name[20]是一個用來存儲姓名的字符型數(shù)組,指針*link是一個用來存儲其直接后繼的指針。定義好了鏈表的結(jié)構(gòu)之后,只要在程序運行的時候在數(shù)據(jù)域中存儲適當?shù)臄?shù)據(jù),如有后繼結(jié)點,則把鏈域指向其直接后繼,若沒有,則置為NULL。

建立了一個單鏈表之后,如果要進行一些如插入、刪除等操作該怎么辦?

1.查找

對單鏈表進行查找的思路為:對單鏈表的結(jié)點依次掃描,檢測其數(shù)據(jù)域是否是我們所要查好的值,若是返回該結(jié)點的指針,否則返回NULL。

2.插入

假設在一個單鏈表中存在2個連續(xù)結(jié)點p、q(其中p為q的直接前驅(qū)),若我們需要在p、q之間插入一個新結(jié)點s,那么我們必須先為s分配空間并賦值,然后使p的鏈域存儲s的地址,s的鏈域存儲q的地址即可。(p->link=s;s->link=q),這樣就完成了插入操作。

插入命令需要使用一次malloc調(diào)用從系統(tǒng)得到一個新單元并在此后執(zhí)行兩次指針調(diào)整。

3.刪除

假如我們已經(jīng)知道了要刪除的結(jié)點p的位置,那么要刪除p結(jié)點時只要令p結(jié)點的前驅(qū)結(jié)點的鏈域由存儲p結(jié)點的地址該為存儲p的后繼結(jié)點的地址,并回收p結(jié)點即可。

看完上述內(nèi)容,你們掌握c語言指針動態(tài)、分布與列表該如何理解的方法了嗎?如果還想學到更多技能或想了解更多相關內(nèi)容,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI