C 數(shù)組指針

2018-07-05 11:21 更新

學習C - C數(shù)組指針

數(shù)組和指針

數(shù)組是同一類型的值的集合。

指針是可以引用另一個的變量(存儲器地址)變量。

你可以使用指針來保存不同的地址變量,只要它們“全部是相同的類型。

沒有索引值的數(shù)組名稱指的是數(shù)組中第一個元素的地址。

您可以更改指針中包含的地址,但是你不能改變數(shù)組名引用的地址。

下面的代碼顯示一個數(shù)組名稱本身指的是一個地址。


    #include <stdio.h>
    int main(void)
    {
      char multiple[] = "My string";

      char *p = &multiple[0];
      printf("The address of the first array element  : %p\n", p);

      p = multiple;
      printf("The address obtained from the array name: %p\n", multiple);
      return 0;
    }

從輸出我們知道表達式& multiple [0] 產(chǎn)生與表達式multiple相同的值。

上面的代碼生成以下結(jié)果。



例2

因為多個計算結(jié)果的第一個字節(jié)的地址數(shù)組和& multiple [0]求值到數(shù)組的第一個元素的第一個字節(jié)。

此程序演示向指針添加整數(shù)值的效果。


    #include <stdio.h>
    #include <string.h>
    int main(void)
    {
      char multiple[] = "a string";
      char *p = multiple;
      for(int i = 0 ; i < strnlen(multiple, sizeof(multiple)) ; ++i) {
         printf("multiple[%d] = %c  *(p+%d) = %c  &multiple[%d] = %p  p+%d = %p\n", i, multiple[i], i, *(p+i), i, &multiple[i], i, p+i);
      }
      return 0;
    }

上面的代碼生成以下結(jié)果。

例3

向p中的地址添加整數(shù)n的計算結(jié)果與 multiple [n] 相同。


#include <stdio.h>
int main(void)
{
  long multiple[] = {15L, 25L, 35L, 45L};
  long *p = multiple;

  for(int i = 0 ; i < sizeof(multiple)/sizeof(multiple[0]) ; ++i) {
    printf("address p+%d (&multiple[%d]): %llu        *(p+%d)   value: %d\n", i, i, (unsigned long long)(p+i),  i,  *(p+i));
  }
  printf("\n    Type long occupies: %d bytes\n", (int)sizeof(long));
  return 0;
}

上面的代碼生成以下結(jié)果。

例4

請注意,您可以在此示例中直接使用數(shù)組名稱。 你可以寫for循環(huán):


#include <stdio.h>
int main(void)
{
      long multiple[] = {15L, 25L, 35L, 45L};
      long *p = multiple;


      for(int i = 0 ; i < sizeof(multiple)/sizeof(multiple[0]) ; ++i)
        printf("address p+%d (&multiple[%d]): %llu        *(p+%d)   value: %d\n",
                      i, i, (unsigned long long)(multiple+i),  i,  *(multiple+i));

      return 0;
}

表達式multiple和multiple + i都計算一個地址。

將乘以1乘以1得到的地址     數(shù)組中的下一個元素,這是在內(nèi)存中的4個字節(jié)。

數(shù)組名稱指的是固定地址,不是指針。

您可以使用數(shù)組名稱作為表達式中的指針,但不能修改它。

上面的代碼生成以下結(jié)果。

多維數(shù)組和指針

下面的代碼就在這里探索與指針相關(guān)的多維數(shù)組。


    #include <stdio.h>
    int main(void)
    {
      char my_array[3][3] = {
                           {"1","2","3"},
                           {"4","5","6"},
                           {"7","8","9"}
                         };

      printf("address of my_array        : %p\n", my_array);
      printf("address of my_array[0][0]  : %p\n", &my_array[0][0]);
      printf("value of my_array[0]       : %p\n", my_array[0]);
      return 0;
    }

下面的代碼就在這里探索與指針相關(guān)的多維數(shù)組。...

所以當你使用數(shù)組名訪問二維數(shù)組時使用a單個索引值my_array [0],你“引用其中一個子數(shù)組的地址。

總結(jié)表達式:

    my_array
    my_array[0]
    &my_array[0][0]

這些都具有相同的值:my_array是二維數(shù)組的地址的炭元素, my_array [0] 是一個char元素的一維數(shù)組的地址,它是一個子數(shù)組 my_array ,& my_array [0] [0] 是char類型的數(shù)組元素的地址。

上面的代碼生成以下結(jié)果。

例5

以下代碼顯示如何在二維數(shù)組中獲取值。


    #include <stdio.h>
    int main(void)
    {
      char my_array[3][3] = {
                           {"1","2","3"},
                           {"4","5","6"},
                           {"7","8","9"}
                         };

      // List all elements of the array
      for(int i = 0 ; i < 9 ; ++i)
         printf(" my_array: %c\n", *(*my_array + i));
      return 0;
    }

上面的代碼生成以下結(jié)果。

例6

你可以在這里看到多維數(shù)組和點:


    #include <stdio.h>
    int main(void)
    {
      char my_array[3][3] = {
                           {"1","2","3"},
                           {"4","5","6"},
                           {"7","8","9"}
                         };

      char *pmy_array = *my_array;             // A pointer to char
      for(int i = 0 ; i < 9 ; ++i)
      printf(" my_array: %c\n", *(pmy_array + i));

      return 0;
    }

上面的代碼生成以下結(jié)果。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號