天天看點

C語言指針複習

#include<stdio.h>
//int main()
//{
//指針:利用位址 它的值指向存在電腦當中另一個地方的值   通過其位址可以找到其記憶體單元   指針是變量-變量裡面存放着位址
//任何存入指針變量的值 就會被當做位址來處理!!!!!!!!
//一個記憶體單元大小:一個位元組
//在32位機上 一個位址是4位元組     在64位機上 一個位址是8個位元組
//指針變量不初始化預設随機産生一個位元組!!!!!
//int a = 1;
//int* p = &a;//p是指針變量-用來存放位址的變量   其類型是  int*

//指針和指針類型
//指針類型決定了指針進行解引用時能通路的空間大小!!!!!
//int* a;a-時能夠通路4個位元組

//char a;a-時能夠通路1個位元組

//double a;*a-時能夠通路8個位元組             !!!!!!!!!!!  決定了之後指派
//printf("%d\n", sizeof(char*));//都是4 因為目前在32位的平台上 預設是4個位元組!!!!!
  //printf("%d\n", sizeof(short*));
  //printf("%d\n", sizeof(int*));
  //printf("%d\n", sizeof(double*));

  //int a = 0x11223344;//存放了一個16進制位的數值(兩個數字一位)-是以這個變量所占4個位元組
  //int* pa = &a;
  //char* pc = &a;
  //pa = 0;//位址a的變量4個位元組全變         0-00 00 00 00
  //pc = 0;//位址a的變量隻有一個首位元組變成了0-00 33 22 11 
  ////printf("%p\n", pa);//輸出表面一模一樣 但是由上面可得 位址内部并不一樣!!!!!
  ////printf("%p\n", pc);

//指針+-整數
//指針類型決定了指針走一步走多遠 (指針的步長)
//int* p+1;向後(右)走了 4 個位元組
//char* p+1;向後走了 1 個位元組
//double* p+1;向後走了 8 個位元組
//  int a = 0x11223344;
//  int* pa = &a;
//  char* pc = &a;
//  printf("%p\n", pa);//006FF740
//  printf("%p\n", pa + 1); //006FF744  整形指針加1位址上加了4個位元組
//
//  printf("%p\n", pc);//006FF740   
//  printf("%p\n", pc+1);//006FF741  符号指針加1位址上加了1個位元組
//  return 0;
//}
/*int main()
{
///int p = NULL;//定義指針為空指針
//利用指針列印數組元素
//int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9,10 };
//int i = 0;
//int sz = sizeof(a) / sizeof(a[0]);
////int* p = a;//取的是首元素的位址  也可以:int* p=&a[i]; 取第i個元素的位址
//int* p = &a[0];
//for (i = 0; i < sz; i++)//代表移動幾次
//{
//  printf("%d\n", p);//列印的是p  p代表的是a的位址!!!!!
//  p=p + 1;//p向右移一位   -或可以變成p++    -的話是向左移動
//}
//指針(減)-指針:得到 的是中間的元素個數
//  int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//  printf("%d\n", &a[9] - &a[0]); //右邊da的位址-左邊小的位址(同一個數組才行)  //如果是左減右的話數組大小是取其絕對值!
//  return 0;
//}
//int my_strlen(char* str)  //因為接受的是char的首元素的位址 是以定義的是char*
//{
//  char* start = str;//首元素的位址
//  char* end = str;//\0的位址
//  while (*end != '\0')
//  {
//    end++;
//  }
//  return end - start;
//}
//
//int main()
//{//strlen 求字元串長度
//遞歸-模拟strlen 計算字元串長度 
//  char arr[] = "hello word";//這個數組是 hello word\0
//  int len =  my_strlen(arr);
//  printf("%d\n", len);
//  return 0;
//}
//int main()
//{
//  int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 90 };
//  printf("%d\n", arr);//都是首元素位址
//  printf("%d\n", &arr[0]);//都是首元素位址
//  //但是:&arr 并不是表示首元素位址  -其是表示(&數組名)-整個數組的位址!!!!!!!!!
//  //sizeof(arr)-sizeof(數組名)   表示的也是整個數組 -其計算的是整個數組的大小 !!!!!-機關(位元組)
//  return 0;
//}
int main()
{
////二極指針
//  int a[] = { 0 };
//  int* pa = &a;//一級指針   建立了指針變量pa
//  int** ppa = &pa;//二級指針變量-存放了指針變量的位址
//  int***pppa = &ppa;//同理:三級指針。。。
//
//指針數組
int a = 10;
int b = 10;
int c = 10;
int* arr2[] = {&a,&b,&c};
int i;
for (i = 0; i < 3; i++)
{
printf("%d\n",*(arr2[i]));//列印arr2每一個數組位址的值
}
return 0;
}