1. 程式人生 > >指針與一維數組和二維數組以及字符串指針數組的學習筆記

指針與一維數組和二維數組以及字符串指針數組的學習筆記

個人 alt sizeof mage .com size 關系 指向 應該

廢話不多少,直接上代碼,關鍵的東西已經註釋了,看註釋信息理解即可。

說明:本程序討論了一維數組和指針的關系,談論了二維數組和指針之間的關系,討論了字符串數組指針數組和指針之間的關系,代碼中以給出定義的方法和簡單的使用,但是有些使用方法並沒有列出,如果需要,

請自行加入printf調試即可。

轉貼請註明出處,歡迎和我討論,謝謝。

               ----------cofin_add

#include <stdio.h>

void fun(int m, char *((*p)[m]))
{
  int i = 0;
  char ** buf = (char **)p;
  for(i=0;i<m;i++)
  {
    printf("%s\t", *(buf+i));
  }
  printf("\n");
}

void fun1(int m, char **buf)
{
  int i = 0;
  for(i=0;i<m;i++)
  {
    printf("%s\t", *(buf+i));
  }
  printf("\n");
}

int main(void)
{
  char *buf[] = {"aa", "bb", "cc", "dd", "ee", "ff"}; //指針數組,其中的每一個變量(指針),指向第一個字符串的首地址。
  char **pa = buf; //如何指向數組中的元素呢,因為其中的每一個元素都是指針,所以應該用二重指針指向它。
  char **px = &buf[0]; //數組名就是數組元素的首地址,可以看到和上面是一樣的。
  char *(*pb)[6] = &buf; //如何指向指針數組本身?因為數組其中共有六個變量(有6個指針或者指針變量(地址)),故應該用數組指針來指向它,
  //但是由於其中的變量是指針,所以應該在加一個*,純屬個人猜測,如果這個成立的話,也可以解釋上面的為什麽是用二重指針了,因為buf和&buf[0]等價
  //也就是說,其實&buf[0] 是地址的地址(因為buf[0]本身存儲的就是地址),應該用二重指針指向。

  //一維數組再研究
  int a[5] = {0}; //定義數組,有5個int型的變量
  int *p1 = a; //定義指針指向數組中的元素
  int (*p2)[5] = &a; //若是要指向這個數組本身,則需要用數組指針指向它,註意要加括號,[]比*優先級高。

  //二維數組的指針研究
  int aa[2][5] = {0};
  int (*p3)[5] = aa; //指向二維數組中的元素,二維數組中的元素就是一維數組,參考指向一維數組的方法即可
  int (*p4)[5] = &aa[0]; //和上面一樣,數組的名字就是數組的首元素的地址,其實是一個地址,也就是一維數組的數組地址。
  int *p5 = &aa[0][0]; //指向二維數組首元素(一維)的首地址,用int *p,類型剛好匹配
  int (*p6)[2][5] = &aa; //指向二維數組本身的指針。總結:把定義中的數組名字換成指針,加()即可。

  char *p = buf[1]; //buf[0] => 裏面存的指針數組中的是第一個元素的地址,也就是直接把一個地址給他初始化

  printf("buf[1] = 0x%x.\n", buf[1]);

  printf("sizeof(buf[1]) = %d.\n", sizeof(buf[1]));
  printf("buf[1] = 0x%x.\n", buf[1]);
  printf("sizeof(buf) = %d.\n", sizeof(buf));

  fun(sizeof(buf)/sizeof(buf[0]), &buf); //這裏傳的是數組指針的地址,類型推倒:原來是一個指針數組,char *pt[x],如果是
  //普通數組的話,char a[x],若指向該數組本身則應該寫作 char (*p)[x] = &a; 根據這一點,類比到指針數組也就是 :char *(*p)[x] = &pt;

  fun1(sizeof(buf)/sizeof(buf[0]), buf); //同理
  return 0;
}

運行結果:

技術分享

指針與一維數組和二維數組以及字符串指針數組的學習筆記