#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
////找出数字出现一次的元素
//int main()
//{
//  int arr[] = { 1,2,3,4,5,1,2,3,4 };
//  int i = 0;
//  int sz = sizeof(arr) / sizeof(arr[0]);
//  //暴力求解
//  //for (i = 0; i < sz; i++)
//  //{
//  //  int count = 0;
//  //  int j = 0;
//  //  for (j = 0; j < sz; j++)
//  //  {
//  //    if (arr[i]==arr[j])
//  //    {
//  //      count++;
//  //    }
//  //  }
//  //  if (count == 1)
//  //  {
//  //    printf("出现一次的元素是:%d\n", arr[i]);
//  //    break;
//  //  }
//  //}
//  //巧妙求解
//  int ret = 0;
//  for (i = 0; i < sz; i++)
//  {
//    ret = ret ^ arr[i];
//  }
//  printf("出现一次的元素是:%d\n", ret);
//  return 0;
//}
////统计一个数的补码中有几个1
//int main()
//{
//  int num = 0;
//  int count = 0;
//  scanf("%d", &num);
//  //方法1
//  //while (num)
//  //{
//  //  if (num % 2 == 1)
//  //    count++;
//  //  num = num / 2;
//  //}
//   
//  //方法2
//  //int i = 0;
//  //for (i = 0; i < 32; i++)
//  //{
//  //  if (1 == ((num >> i) & 1))
//  //    count++;
//  //}
//
//  //方法3
//  //while (num)
//  //{
//  //  count++;
//  //  num = num & (num - 1);
//  //}
//
//  printf("%d\n", count);
//  return 0;
//}
//int main()
//{
//  int a = 10;
//  char c = 'r';
//  char* p = &c;
//  int arr[10] = { 0 };
//  //sizeof 计算的变量所占内存空间的大小,单位是字节
//  printf("%d\n", sizeof(a));//4
//  printf("%d\n", sizeof(int));
//
//  printf("%d\n", sizeof(c));//1
//  printf("%d\n", sizeof(char));
//
//  printf("%d\n", sizeof(p));//4
//  printf("%d\n", sizeof(char*));
//
//  printf("%d\n", sizeof(arr));//40
//  printf("%d\n", sizeof(int [10]));
//  return 0;
//}
//void test1(int arr[])
//{
//  printf("%d\n", sizeof(arr));//4
//}
//void test2(char ch[])
//{
//  printf("%d\n", sizeof(ch));//4
//}
//int main()
//{
//  int arr[10] = { 0 };
//  char ch[10] = { 0 };
//  printf("%d\n", sizeof(arr));//40
//  printf("%d\n", sizeof(ch));//10
//  test1(arr);
//  test2(ch);
//  return 0;
//}
//创建一个结构体
//struct stu
//{
//  char name[20];
//  int age;
//  char id[20];
//};
//int main()
//{
//  struct stu s1 = { "张三",20,"20220303" };
//  struct stu* p = &s1;
//  //结构体变量.成员名
//  printf("%s\n", s1.name);
//  printf("%d\n", s1.age);
//  printf("%s\n", s1.id);
//
//  printf("%s\n", (*p).name);
//  printf("%d\n", (*p).age);
//  printf("%s\n", (*p).id);
//  //结构体指针->成员名
//  printf("%s\n", p->name);
//  printf("%d\n", p->age);
//  printf("%s\n", p->id);
//
//  return 0;
//}
//整形提升-高位补充符号位
//int main()
//{   
//  char a = 0xb6;//10110110
//  short b = 0xb600;//1011011000000000
//  int c = 0xb6000000;//10110110000000000000000000000000
//  if (a == 0xb6)//比较运算要整形提升,提升后11111111111111111111111110110110
//    printf("a");
//  if (b == 0xb600)//同上
//    printf("b");
//  if (c == 0xb6000000)//已经是整形,不需要提升
//    printf("c");
//  return 0;
//}
//初识指针
//int main()
//{
//  int a = 0x11223344;
//  int* pa = &a;
//  *pa = 0;//可以正确改变
//  char* pc = &a;
//  *pc = 0;//只能改变一个字节
//  //printf("%p\n", pa);
//  //printf("%p\n", pc);
//  //指针类型决定了指针进行解引用操作的时候,能够访问空间的大小
//  //in* p;     *p能够访问4个字节
//  //char* p;   *p能够访问1个字节
//  //double* p; *p能够访问8个字节
//  printf("%p\n", pa);
//  printf("%p\n", pa + 1);
//  printf("%p\n", pc);
//  printf("%p\n", pc + 1);
//  //指针类型决定了指针走一步走多远(指针的步长)
//  //int* p;    p+1-->4
//  //char* p;   p+1-->1
//  //double* p; p+1-->8
//  return 0;
//}
//
//int main()
//{
//  int arr[10] = { 0 };
//  int* p = arr;    //数组首元素地址
//  //char* p = arr; //只能把前10个字节的值变成1,不能把10个元素变成1
//  int i = 0;
//  for (i = 0; i < 10; i++)
//  {
//    *(p + i) = 1;
//    printf("%d\n", arr[i]);
//  }
//  return 0;
//}
//野指针
//1.指针未初始化
//int main()
//{
//  int a; //局部变量不初始化,默认是随机值
//  int* p;//局部的指针变量,就被初始化随机值
//  *p = 20;
//  return 0;
//}
////2.指针越界
//int main()
//{
//  int arr[10] = { 0 };
//  int* p = arr;
//  int i = 0;
//  for (i = 0; i < 12; i++)
//  {
//    p++;//指针指向的范围超出数组的范围,就是野指针
//  }
//  return 0;
//}
////3.指针指向的空间释放
//int* test()
//{
//  int a = 10;
//  return &a;
//}
//int main()
//{
//  int* p = test();
//  *p = 20;
//  return 0;
//}
//int main()
//{
//  //int a = 10;
//  //int* pa = &a;//初始化
//  //int* p = NULL;//NULL-用来初始化指针的,给指针赋值
//  int a = 10;
//  int* pa = &a;
//  *pa = 20;
//
//  pa = NULL;//这时候*pa就不能访问了
//
//  if (pa != NULL)//判断指针不是空指针才能使用
//  {
//
//  }
//
//}
////指针运算
//int main()
//{
//  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//  int i = 0;
//  int sz = sizeof(arr) / sizeof(arr[0]);
//  /*int* p = arr;
//  for (i = 0; i < sz; i++)
//    {
//    printf("%d\n", *p);
//    p++;
//  }*/
//  
//  /*int* p = &arr[9];
//  for (i = 0; i < 5; i++)
//  {
//    printf("%d\n", *p);
//    p -= 2;
//  }*/
//
//  /*int* p;
//  for (p = &arr[0]; p <= &arr[9];)
//  {
//    *p++ =0;//后置++  赋值0后*p再++  //前置++  *P++后赋值0
//  }*/
//
//  printf("%d\n", &arr[9] - &arr[0]);//同一个空间 指针-指针得到的是元素个数
//
//  return 0;
//}
//求字符串长度的另一种方法
//int my_strlen(char* str)
//{
//  char* start = str;
//  char* end = str;
//  while (*end != '\0')
//  {
//    end++;
//  }
//  return end - start;
//}
//
//int main()
//{
//  char arr[] = "china";
//  int len = my_strlen(arr);
//  printf("%d\n", len);
//  return 0;
//}
//指针比较
//int main()
//{
//  int arr[10];
//  int* p = arr;
//  //一种 允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较
//  for (p = &arr[10]; p > &arr[0];)
//  {
//    *--p = 1;
//  }
//  //另一种 不允许与指向第一个元素之前的那个内存位置的指针进行比较
//  /*for (p = &arr[10]; p >= &arr[0]; p--);
//  {
//    *p = 1;
//  }*/
//
//}
//指针和数组
//int main()
//{
//  int arr[10] = { 0 };
//  printf("%p\n", arr);//地址-首元素的地址
//  printf("%p\n", arr+1);
//
//  printf("%p\n", &arr[0]);
//  printf("%p\n", &arr[0]+1);
//
//  printf("%p\n", &arr);
//  printf("%p\n", &arr+1);
//  //&arr-&数组名-数组名不是首元素的地址,数组名表示整个数组,&数组名取出的是整个元素的地址
//  //sizeof(arr)-sizeof(数组名)-数组名表示整个数组,sizeof(数组名)计算的是整个数组的大小
//  return 0;
//}
//
//int main()
//{
//  int arr[10] = { 0 };
//  int* p = arr;
//  int i = 0;
//  for (i = 0; i < 10; i++)
//  {
//    *(p + i) = i;
//  }
//  /*for (i = 0; i < 10; i++)
//  {
//    printf("%p ==== %p\n", p + i, &arr[i]);
//  }*/
//  for (i = 0; i < 10; i++)
//  {
//    printf("%d ", arr[i]);
//    printf("%d \n", *(p + i));
//  }
//
//  return 0;
//}
//二级指针
//int main()
//{
//  int a = 10;
//  int* p = &a;
//  int** pp = &p;//pp就是二级指针
//  int*** ppp = &pp;
//  **pp = 20;
//  printf("%d\n", **pp);
//  printf("%d\n", a);
//  return 0;
//}
//指针数组
int main()
{
  int a = 10;
  int b = 20;
  int c = 30;
  int* pa = &a;
  int* pb = &b;
  int* pc = &c;
  int* arr[3] = { &a,&b,&c };//指针数组-存放指针
  int i = 0;
  for (i = 0; i < 3; i++)
  {
    printf("%d ", *arr[i]);
  }
  return 0;
}