上節課我們學習了文件型指針的運用。這節課我們則學習了變量型指針和鏈表的學習的使用。還了解了free函數、malloc函數的應用
#include<stdio.h>
int main()
{
FILE *fp;
if((fp=fopen("c://my/test.txt","r+"))==NULL) ()
{
printf("文件沒有正確打開,不能往下執行了. \n");
return(1);
}
}
文件型指針
#include<stdio.h>
int main()
{
int*ptr; // 聲明一個int指針
intval = 1; // 聲明一個int值
ptr= &val; // 爲指針分配一個int值的引用
intderef = *ptr; // 對指針進行取值,打印存儲在指針地址中的內容
printf("deref地址=%ld,值=%d\n",ptr, deref);
}
通過*操作符聲明瞭一個int指針。接着我們聲明瞭一個int變量並賦值爲1。然後我們用int變量的地址初始化我們的int指針。接下來對int指針取值,用變量的內存地址初始化int指針。最終,我們打印輸出變量值,內容爲1。
第6行的&val是一個引用。在val變量聲明並初始化內存之後,通過在變量名之前使用地址操作符&我們可以直接引用變量的內存地址。
第8行,我們再一次使用*操作符來對該指針取值,可直接獲得指針指向的內存地址中的數據。由於指針聲明的類型是int,所以取到的值是指針指向的內存地址存儲的int值。
指針與數組
#include<stdio.h>
int main()
{
intmyarray[4] = {1,2,3,0};
int *ptr = myarray;
printf("ptr地址=%ld,值*ptr=%d\n", ptr,*ptr);
ptr++;
printf("ptr地址=%ld,值*ptr=%d\n", ptr,*ptr);
ptr++;
printf("ptr地址=%ld,值*ptr=%d\n", ptr,*ptr);
ptr++;
printf("ptr地址=%ld,值*ptr=%d\n", ptr,*ptr);
}
C語言的數組表示一段連續的內存空間,用來存儲多個特定類型的對象。與之相反,指針用來存儲單個內存地址。數組和指針不是同一種結構因此不可以互相轉換。而數組變量指向了數組的第一個元素的內存地址。
一個數組變量是一個常量。即使指針變量指向同樣的地址或者一個不同的數組,也不能把指針賦值給數組變量。也不可以將一個數組變量賦值給另一個數組。然而,可以把一個數組變量賦值給指針,這一點似乎讓人感到費解。把數組變量賦值給指針時,實際上是把指向數組第一個元素的地址賦給指針。
指針與結構體
#include<stdio.h>
struct person {
intage;
char*name;
};
int main()
{
struct person first;
struct person *ptr;
first.age = 21;
char*fullname = "full name";
first.name = fullname;
ptr= &first;
printf("age=%d, name=%s\n",first.age, ptr->name);
}
#include<stdio.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
main()
{
intcount,*array; /*count是一個計數器,array是一個整型指針,也可以理解爲指向一個整型數組的首地址*/
if((array=(int *) malloc(10*sizeof(int)))==NULL)
{
printf("不能成功分配存儲空間。");
exit(1);
}
for(count=0;count<10;count++) /*給數組賦值*/
array[count]=count;
for(count=0;count<10;count++) /*打印數組元素*/
printf("%d-",array[count]);
}
上例中動態分配了10個整型存儲區域,然後進行賦值並打印。例中if((array=(int *) malloc(10*sizeof(int)))==NULL)語句可以分爲以下幾步:
1)分配10個整型的連續存儲空間,並返回一個指向其起始地址的整型指針
2)把此整型指針地址賦給array
3)檢測返回值是否爲NULL
2、free函數
由於內存區域總是有限的,不能不限制地分配下去,而且一個程序要儘量節省資源,所以當所分配的內存區域不用時,就要釋放它,以便其它的變量或者程序使用。這時我們就要用到free函數。
其函數原型是:
void free(void *p)
作用是釋放指針p所指向的內存區。
其參數p必須是先前調用malloc函數或calloc函數(另一個動態分配存儲區域的函數)時返回的指針。給free函數傳遞其它的值很可能造成死機或其它災難性的後果。
注意:這裏重要的是指針的值,而不是用來申請動態內存的指針本身。例:
int *p1,*p2;
p1=malloc(10*sizeof(int));
p2=p1;
……
free(p1) /*或者free(p2)*/
malloc返回值賦給p1,又把p1的值賦給p2,所以此時p1,p2都可作爲free函數的參數。
malloc函數是對存儲區域進行分配的。
free函數是釋放已經不用的內存區域的。
malloc函數
malloc函數的原型爲:
void *malloc (unsigned int size)
其作用是在內存的動態存儲區中分配一個長度爲size的連續空間。其參數是一個無符號整形數,返回值是一個指向所分配的連續存儲域的起始地址的指針。還有一點必須注意的是,當函數未能成功分配存儲空間(如內存不足)就會返回一個NULL指針。所以在調用該函數時應該檢測返回值是否爲NULL並執行相應的操作。