天天看點

指針進階2

#define _CRT_SECURE_NO_WARNINGS 1
//數組指針:将數值的位址存放起來
//數組指針與指針數組差別
//指針數組是用來存放數組中每一個元素位址的指針
//數組指針是用來存放數組位址的指針
//#include <stdio.h>
//int main()
//{
//  //int* p=NULL;//整形指針-指向整形指針-可以存放整形的位址
//  //char* pc = NULL;//pc是字元指針-指向數組指針-存放字元位址
//  //數組指針-存放數組的指針-存放數組 的位址
//  //int arr[10] = { 0 };
//  ////arr-首元素位址
//  ////&arr[0]-首元素的位址
//  ////&aar-數組的位址
//  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//  //int *p[10]=&arr;//這樣的寫法是錯誤的由于"[]"優先級高于“*”;
//  //int *p;//是數組指針
//  int (*p)[10] = &arr;//數組指針
//  //P就是 數組指針
//  return 0;
//}
//思考題目:将下面代碼中的pa完整定義為數組指針
//#include<stdio.h>
//int main()
//{
//  char* arr[5];
//  pa = &arr;
//  return 0;
//}
//個人答題如下:
//#include<stdio.h>
//int main()
//{
//  char* arr[5];
//  //char(*p)[5] =&arr;//錯誤:"char*(*)[5]"類型的值不能用于初始化"char(*)[5]"類型的實體
//  char* (*p)[5] = &arr;//答案
//  //一、"(*P)[5]"中
//  //1.pa:是一個指針變量名;
//  //2.“*”:說明pa是指針;
//  //3.[5]:pa指向的數組是五個元素的;
//  //二、char*:數組arr[5]的類型是char*
//  //三、總:一個名為(*pa)的指針且類型為"char*"指向一個擁有五個元素的數組arr且類型也為"char*";
//  return 0;
//}
//用法實列
// 1-普通用法(一維指針)
//#include<stdio.h>
//int main()
//{
//  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//  int(*p)[10] = &arr;
//  //輸出第一種方法
//  //for (int i = 0; i < 10; i++)
//  //{
//  //  printf("%d\n", (*p)[i]);
//  //  //數組的位址名為pa然後解引用*pa則當拿出第一個元素時候應該為“(*pa)[0]”,是以拿出數組中的所有元素應該為"(*pa)[i]";
//  //}
//  //第二種
//  //for (int i = 0; i < 10; i++)
//  //{
//  //  printf("%d\n", *(*p + i));//*p==arr(首元素位址)
//  //  //由于*p==arr(首元素位址)則向後跳i個位址列印(*p+i),然後在括号括起來(*(*p+i))解引用;
//  //}
//  //第三種:最常用的寫法
//  //int* p = arr;
//  //for (int i = 0; i < 10; i++)
//  //{
//  //  printf("%d\n",*(p+i) );
//  //  //名一個p==arr(首元素位址)然後在for循環中((p+i))z最後在解引用(*(p+i));
//  //}
//  return 0;
//}
//2-加深用法(二維指針)
//#include<stdio.h>
//// 二維數組列印(參數是數組的形式)
//void print1(int arr[3][5], int x, int y)//int arr[3][5]-數組形式
//{
//  int i = 0, j = 0;
//  for (i = 0; i < x; i++)
//  {
//    for (j = 0; j < y; j++)
//    {
//      printf(" %d ", arr[i][j]);//列印出一行
//    }
//    printf("\n");//列印出一行後換行在列印是以在列印行的循環中
//  }
//}
////利用數組指針列印二維數組(參數是指針的形式)
//void print2(int (*p)[5], int x, int y)
////int (*p)[5](數組指針)的了解:*p是一個指針,(*p)指向一個數組,(*p)[5]數組有五個元素,int (*p)[5]類型為int;
//{
//  int i = 0, j = 0;
//  for (i = 0; i <x; i++)
//  {
//    for (j = 0; j < y; j++)
//    {
//      //第一種形式
//      //printf(" %d ", *(*(p + i) + j)); 
//      //*(*(p+i)+j)的了解:p:指向一行的元素,p+i:跳過i行
//                //*(p+i):解引用找到p+i行拿到該行的數組名,*(p+i)+j:找到具體的第幾行第幾列,*(*(p+i)+j):解引用第i行第j列的元素;
//      //第二種形式
//        printf(" %d ", (*(p + i))[j]);//( * (p + i))[j]==(arr[i])[j]==(*(arr+i))[j]證明在下一個代碼中;
//      //(*(p + i))[j]的了解:p;指向一行元素,p+i:跳過i行/*(p+i):解引用找到p+i行拿到該行的數組名
//                //(*(p+i)):列印每一行的元素,( * (p + i))[j]:列印每行每列的元素
//      //第三種形式
//        printf(" %d ",*(p[i]+j));//*(p[i]+j)==p[i][j]
//    }
//    printf("\n");
//  }
//}
//int main()
//{
//  int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
//  print1(arr,3,5);//arr-數組名-首元素位址-這個首元素位址代表的是第一行的位址
//  //列印二維數組的函數為“print1”,将數組"arr"傳到函數中,為了友善知道行(3)和列(5)也要把行和列傳入函數中;
//  print2(arr, 3, 5);//arr-數組名-首元素位址-這個首元素位址代表的是第一行的位址
//  //當要把二維數組的首元素位址讨論出來則需要把二維數組相信為一維數組
//  //如int arr[3][5]中的第一個元素是第一行的元素,第二個元素是第二行的元素,第三個元素是第三行的元素
//  //通過以上可知如果arr(首元素位址)傳參傳遞的是第一行五個int類型元素則我們就可以把其想為一個數組指針進行輸出
//  return 0;
//}
////( * (p + i))[j]==(arr[i])[j]==(*(arr+i))[j]證明如下:
//#include<stdio.h>
//int main()
//{
//  int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
//  int (*p)[3][5] = &arr;
//  int j = 0, i = 0;
//  for (i = 0; i < 3; i++)
//  {
//    for (j = 0; j < 4; j++)
//    {
//      printf(" %d ",(* (arr + i)) [j]);
//    }
//    printf("\n");
//  }
//
//  return 0;
//}
//總結
//#include<stdio.h>
//int main()
//{
//  int arr[5];//arr是一個5個元素的數組
//  int* parr1[10];//parr1是一個數組,數組有10個元素,每個元素的類型是int*,parr1是指針數組
//  int(*parr2)[10];//parr2是一個指針,該指針指向一個數組,數組有10個元素,每個元素的類型是int,parr2是一個數組指針;
//  int((*parr3[10])[5]);//parr3是一個數組,該數組有十個元素,每個元素是一個數組指針,該數組指針指向的數組有五個元素,每個元素的類型為int
//  return 0;
//}