<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. C語言中指針高級用法介紹

    時間:2025-12-19 07:16:57 C語言

    C語言中指針高級用法介紹

      問題描述:指針是C語言很有特色的一個部分,但是使用也比較復雜,很容易導致一些莫名的錯誤,比如有時候函數指針沒有賦值,有時指向了未定義的內存,這些時候都可能導致程序異常執行或者崩潰。但指針的靈活性讓它可以實現很多復雜的操作,如指向指針的指針,指向函數的指針。

      指向指針的指針:函數傳遞參數是傳值調用的,如果想在調用函數時改變傳入的參數的值,而且該傳入的參數的值本來是個指針時,這時就可以使用指向指針的指針了,以這種方式一般不用給函數返回參數,函數中只拷貝指向指針的指針值,而被指向的指針以及該指針指向的內存單元都可以直接操作,

      void add_to_list(struct node **list, int n) {

      struct node *new_node;

      new_node = malloc(sizeof(struct node));

      if(new_node == NULL) {  /pic/p>

      printf("Error: malloc failed in add_to_list\n");

      exit(EXIT_FAILURE);

      }

      new_node->value = n;

      new_node->next = *list;

      *list = new_node;

      }

      add_to_list(&first, 10);

      該函數用于將結點添加到一個鏈表的表頭,first本身是一個指針,其指向鏈表的表頭結點,&first將其指針的地址傳入函數賦值給指向指針的指針**list,此時list為指向first指針的指針,*list即為first,因此在函數內部對*list進行操作即相當于對外部的first指針進行操作一樣,圖示如下:

      [指針]C語言中指針的高級用法

      指向函數的指針:指針不只能指向數據,也能指向函數。函數占用內存單元,每個函數都有地址的,因此可以使用指向函數的指針。指向函數的指針在調用函數較多的地方會用到,另外也可以設計架構利用函數指針模擬某一對象的行為。

      double integrate(double (*f)(double), double a, double b); /pic/p>

      double integrate(double f(double), double a, double b); /pic/p>

      result = integrate(sin, 0.0, PI/2); /pic/p>

      在integrate函數體內(*f)(x)即表示sin(x)的調用。

      由于C語言將函數指針當成數據指針對待,可以將函數指針存儲在變量之中,也可以當作數組的元素,這樣,在索引數組元素時就可以得到事先存儲好的函數調用了。函數指針也可用作結構或聯合的成員,可以作為函數的返回值等。

      傳遞給函數指針的值是某個函數的函數名,后面不用括號,這個與數組類似,數組名代表地址,函數名也是代表地址。

      void (*pf)(int);  /pic/p>

      pf = f;  /pic/p>

      (*pf)(i);  /pic/p>

      函數指針數組:

      void (*file_cmd[])(void) = {new_cmd, open_cmd; close_cmd, close_all_cmd, save_cmd, save_as_cmd, save_all_cmd, print_cmd, exit_cmd};  /pic/p>

      (*file_cmd[n])();  /pic/p>

      受限指針(C99):

      int * restrict p;  /pic/p>

      受限指針p指向的對象在之后需要修改,那么該對象不會允許通過除p之外的任何方式訪問。一個例子就是中的memcpy和memmove兩個函數的區別,其原型分別為:

      void *memcpy(void * restrict s1, const void * restrict s2, size_t n); /pic/p>

      void *memmove(void * s1, const void * s2, size_t n);

      靈活數組成員(C99):這個功能用于字符串數組作為結構的成員時動態分配內存,

      struct vstring {

      ing len;

      char chars[];

      };  /pic/p>

      struct vstring *str = malloc(sizeof(struct vstring) + n);

      str->len = n;

    【C語言中指針高級用法介紹】相關文章:

    C語言指針的用法05-21

    C語言中指針的用法介紹05-04

    C語言指針用法詳解04-17

    C語言學習中的指針用法教程12-10

    C語言入門之指針用法05-08

    C語言的指針12-21

    C語言中各種類型指針的特性與用法介紹04-17

    C語言結構體中的函數指針03-21

    在Swift中怎么使用C語言的指針05-19

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人