/* 复习 1.指针类型 int *指针类型 指针指向的变量类型指针指向哪个变量2.基本数据类型 4种指针类型 存放的地址 和系统有关系 4个字节数组类型结构体 枚举 联合3.指针加法减法 p++ 和数组搭配使用4.两个运算符 *取值(解引用) &取地址5. *(p+i) p[i] (p是指针 i是整型)p[i]的地址 &p[i] p+i*/#include<stdio.h> #include<string.h> int win;//全局变量 int main() {//1.复习//int* p;//int *p;int * p;没有任何区别int* p, *q;//定义两个指针 指针前面要记得单独加*char chArr[] = "helloworld";//字符数组 存放字符串 栈区char *pArr = "helloworld";//指针 字符串存放在常量区 ,指针指向它存放的首地址 字符串不能(不可以被修改)//代码区 全局数据区(常量区) 堆区 栈区/*数组输出 除了字符数组 字符数组 \0作为结尾 printf("%s",chArr);//用printf输出%s 输出这个地址和地址后的所有字符 直到遇到\0为止scanf("%s",chArr);//数组名就是数组首地址 数组第一个元素的地址*///相同点 puts(chArr);//都可以用来打印printf strcmp strlen puts(pArr);//不同点 pArr不能用于输入 //gets(chArr);//gets(pArr);//不可以修改内容//strcpy strcat strlen 字符串的函数 //strcpy(pArr, chArr);//不可以修改常量区//2.指针的加加 ++ 指针加1 // 指针++的时候同时解引用int iArr[10] = { 0 };int iBrr[10] = { 0 };p = iArr, q = iBrr;//*p++; (*p)++; printf("*p=%d,p=%p\n", *p, p);//*p++;*p++=5; //先给*p赋值 然后p++ 等价*p=5,p++printf("*p=%d,p=%p\n", *p, p);printf("*q=%d,q=%p\n", *q, q);(*q)++;printf("*q=%d,q=%p\n", *q,q);/**p++ p加了1 (*p)++ p指向的内容 加了1*(p++) 和*p++没有区别//课后自己试试* 后++ 取值 p++ 都是操作指针 *p++ (*p)++ 对*p进++ 指向的变量进行++今天的作业题目 测试作用*++p++*p附加题(可以不做) 测试二级指针和数组指针加1之后的地址偏移*///3.指针和数组 (理论)/*指针加1 偏移一个数据的长度数组同样可以看成一个类型 int arr[10]arr -->大小 存数据 地址*/int idArr[5][10];//二维数组//p = idArr;//类型不一致//方案1//p = &idArr[0][0]; //赋值数组第一个元素地址//for (int i = 0; i < 5 * 10; i++)//用指针给数组赋值//{// *p = i; // p++;// //*p++ = i;//}//方案2//数组指针 指针指向整个数组 //int (*pd)[10]=idArr;int(*pd)[10];//定义一个数组指针//pd= idArr;pd = &idArr[0];//赋值 for (int i = 0; i < 5; i++)//用数组指针给他赋值 {for (int j = 0; j < 10; j++){pd[i][j] = i*j;//使用 }}/*pd[i][j] (*(p+i))[j] *(p[i]+j) *(*(p+i)+j)等价*pd[3] ==>*((pd[3])+0)*///数组指针和指针数组int(*point)[10];//数组指针 指向数组的指针int *parr[10];//指针数组 int* parr[10] 指针数组 10个int* 10个元素都是指针//二级指针 指针保存的是一个一级指针的地址 用到二级指针int **pp;pp= &p;//p是一级指针 pp保存一级指针地址 pp = parr;//指针数组名pp = &parr[0];//parr[0]是一个一级指针 for (int i = 0; i < 5; i++)//循环打印 {for (int j = 0; j < 10; j++){printf("%d\t", idArr[i][j]);}printf("\n");}getchar();return 0;}