<C> 指针02 - 2017/11/24
复习:
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() { #if 0 // 1.复习 /** 相同点: * 数组输出 除了字符数组 * 字符数组 \0作为结尾 * printf_s("%s",chArr); // 用printf_s输出 * %s 输出这个地址和地址后的所有字符 直到遇到 \0 为止 * scanf_s("%s",charr); // 数组名就是数组首地址 数组第一个元素的地址<不需要取地址> * *** 不同点: * */ int *p,*q; // 定义两个指针 < 指针前面要记得单独加* > char chArr[] = "HelloWorld"; // 字符数组 ->存放字符串 char *pArr = "HelloWorld"; // 指针(存放地址) 字符串存放在常量区,指针指向它存放的首地址 (不可以被修改) // 代码区 全局数据区(常量区) 堆区 栈区 puts(chArr+1); // 都可以用来打印printf_s strcmp puts(pArr); // 不同点 pArr不能用于输入 // gets_s(chArr); // gets(pArr); 不可以修改内容 // strcpy strcat strlen 字符串的函数 //strcpy(pArr,chArr); // 不可以修改常量区 #elif 0 // 2.指针的加加 ++ 指针加 1 /** * 指针 ++ 的时候同时解引用 * * *p++; (*p)++; */ int *p,*q; // 定义两个指针 int iArr[10] = { 0 }; int iBrr[10] = { 0 }; p = iArr, q = iBrr; printf_s("*p=%d,p=%p\n", *p, p); *p++=5; // *P++=5; 先给*p 赋值 然后p++ 等价 *p = 5,p++ printf_s("*p=%d,p=%p\n", *p, p); printf_s("*q=%d,q=%p\n", *q, q); (*q)++; printf_s("*q=%d,q=%p\n", *q, q); /** * *p++ 相当于 p加了1 * (*p)++ 相当于 p指向的内容 加了1 * * *(p++) 和*p++没有区别 // 课后自己试试 * * * 后++ 取值 p++ 都是操作指针 * *p++ * (*p)++ 对*p进行++ 指向的变量进行++ * * *++p * ++*p */ #elif 0 // 3.指针和数组 /** * 指针加1 -> 偏移一个数据的长度 * * 数组同样可以看成一个类型 int arr[10]; * arr --> 大小 存数据 地址 */ int *p, *q; // 定义两个指针 int idArr[5][10]; // 定义一个二维数组 //p = &idArr; // 类型不一致 p = &idArr[0][0]; // 赋值数组第一个元素地址 /* 方案一: */ /*for (int i = 0; i < 5 * 10; i++) // 用指针给数组赋值 { //*p = i; //p++; *p++=i; }*/ /* 方案二: */ /** * 数组指针 指针指向整个数组 */ int(*sum)[10]; // 定义一个数组指针 sum = idArr; // 赋值 //sum = &idArr[0]; /* 用循环赋值 */ for (int i = 0; i < 5; i++) { for (int j = 0; j < 10; j++) { idArr[i][j] = i*j; } } /** * sum[i][j] 等价 (*(p+i))[j] *(p[i]+j) *(*(p+i)+j) * * *sum[3] ==>*((sum[3])+0) */ for (int i = 0; i < 5; i++) // 循环打印 { for (int j = 0; j < 10; j++) { printf_s("%d\t", idArr[i][j]); } printf_s("\n"); } #elif 1 // 数组指针和指针数组 int(*point)[10]; // 数组指针 指向数组的指针 int *parr[10]; // 指针数组 int* parr[10] 指针数组 10个int* 10个元素都是指针 int *p, *q; /** * 二级指针 指针保存的是一个一级指针的地址 用到二级指针 * */ int **pp = &p; // p是一级指针 pp保存一级指针地址 pp = parr; // 指针数组名 <指向指针数组> pp = &parr[0]; // parr[0]是一个一级指针 #endif getchar(); return 0; }