指針作業

上節課我們學習了文件型指針的運用。這節課我們則學習了變量型指針和鏈表的學習的使用。還了解了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

2free函數

由於內存區域總是有限的,不能不限制地分配下去,而且一個程序要儘量節省資源,所以當所分配的內存區域不用時,就要釋放它,以便其它的變量或者程序使用。這時我們就要用到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,所以此時p1p2都可作爲free函數的參數。

malloc函數是對存儲區域進行分配的。

free函數是釋放已經不用的內存區域的。

 

 

 

malloc函數

malloc函數的原型爲:

void *malloc (unsigned int size)

其作用是在內存的動態存儲區中分配一個長度爲size的連續空間。其參數是一個無符號整形數,返回值是一個指向所分配的連續存儲域的起始地址的指針。還有一點必須注意的是,當函數未能成功分配存儲空間(如內存不足)就會返回一個NULL指針。所以在調用該函數時應該檢測返回值是否爲NULL並執行相應的操作。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章