tft每日頭條

 > 科技

 > c語言指針和數組知識點總結

c語言指針和數組知識點總結

科技 更新时间:2025-01-11 09:02:26

  基本概念 先看以下例子:

  int a[10]; int *pa = pa ;

  首先指針pa指向a[0]的地址,注意後綴運算符的優先級高于單目運算符,所以是取a[0]的地址,而不是取a的地址。然後pa 讓pa指向下一個元素(也就是a[1]), 由于pa 是int* 指針,一個int 型元素占4個字節,所以pa 使pa 所指向的地址加4,注意不是加1。

  用方框表示存儲空間,用箭頭表示指針和變量之間的關系:

  c語言指針和數組知識點總結(LinuxC編程)(1)

  既然指針可以用 運算符,當然也可以用 , - 運算符,pa指向a[1],那麼pa 2指向a[3]。

  *(pa 2)也可以寫成pa[2],pa就像數組名一樣,a[2]之所以能取數組的第二個元素,是因為它等于*(a 2),當數組名做右值時自動轉換成指向首元素的指針,所以a[2]和pa[2]本質上是一樣的,都是通過指針間接尋址訪問元素。

  由于a做右值使用時和&a[0] 是一個意思,所以 int *pa = 通常不這麼寫, 而是寫成更簡潔的形式: int *pa = a;

  在函數原型中,如果參數是數組,則等價于參數是指針的形式,例如:

  void func(int a[10]) { ... }

  第一種形式的方括号中的數字可以不寫,仍然是等價的:

  void func(int a[]) { ... }

  參數寫成指針形式還是數組形式對編譯器來說沒有區别,都表示這個參數是指針,之所以規定兩種形式是為了給代碼的人提供有用的信息,如果這個參數指向一個元素,通常寫成指針的形式,如果這個參數指向一串元素中的首元素,則通常寫成數組的形式。

  指針與自增運算符之間的關系 (*p) , 先傳值,後值自增1,類比a

  *p == *(p ), 先傳值,後地址自增1

  *p == (*p), 值先自增1,後傳值,類比a

  * p == *( p), 地址先自增1, 後傳值

  #include stdio.h int main() { int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int *pa = printf(*pa = %d\n pa ; printf(*pa = %d\n printf(*pa = %d\n, *( pa)); return 0; }

  指針與const限定符 const限定符和指針結合起來常見的情況有以下幾種:

  const int *a; int const *a;

  這兩種寫法是一樣的,a是一個指向const int 型的指針,a 所指向的内存單元不可改寫,所以(*a) 是不允許的,但 a 可以改寫,所以a 是允許的。

  int * const a;

  a 是一個指向int 型const 指針,*a 是可以改寫的,但a不允許改寫。

  int const * const a;

  a 是一個指向const int 型的const 指針,因此*a 和 a 都不允許改寫。

  指向非const 變量的指針或者非const變量的地址可以傳給指向const變量的指針,編譯器可以做隐式類型轉換,例如:

  char c = const char *pc =

  但是,指向const變量的指針或者const變量的地址不可以傳給指向非const變量的指針,以免透過後者意外改寫了前者所指向的内存單元,下面的代碼編譯器在編譯時會報警告:

  const char c = char *pc =

  良好的編程習慣應該盡可能多地使用const, 有以下幾個優點:

  1. const 給代碼的人傳達非常有用的信息。比如一個函數的參數是 const char *, 或者是const int *, 在調用這個函數時就可以放心地傳給它char * 或 const char * 指針, 而不必擔心指針所指的内存單元被改寫。 2. 盡可能多地使用const 限定符,把不該變的都聲明為隻讀,這樣可以依靠編譯器檢查程序中的Bug, 防止意外改寫數據。 3. const 對編譯器優化是一個有用的提示,編譯器也許會把const 變量優化成常量。

  字符串字面值通常分配在.rodata段,字符串字面值類似于數組名,當字面值作為右值使用時自動轉換成指向首元素的指針,這種指針應該是co nst char * 型。printf 函數原型的第一個參數是const char *型,可以把char *或const char *指針傳給它,參考下面的調用:

  const char *p = abcd const char str1[5] = abcd char str2[5] = abcd printf(p); printf(str1); printf(str2); printf(abcd

  如果要定義一個指針指向字符串字面值,這個指針應該是const char * 型,如果寫成char *p = abcd 會有被串改的隐患:

  int main(void) { char *p = abcd ... *p = ... }

  p 指向 .rodata 段,不允許改寫,但編譯器不會保存,在運行時出現段錯誤。

  ,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved