<C> 指针补课 - 2017/11/25
#include <stdio.h> #include <stdlib.h> int main() { #if 0 //====================================一维数组================================ /** * 指针 指针类型 指针指向的数据类型 指针指向的数据的内容 * malloc 申请内存 * free 释放内存 * * * // 堆内存 int[10] 存放10个int * 指针不能直接赋值 * 如: * int *q = 1; // 错误的 * * int *q; * *q = 1; // q没有指向什么变量 *q会出错 * * 指针不单独使用 要么变量 数组 堆内存 */ // int(*p)[5]; // 定义一个数组指针变量 int n; // printf_s("请输入要数据的个数:"); scanf_s("%d", &n); // int arr[n]; // int *p = (int*)malloc(10 * sizeof(int)); // 申请数组 大小40个字节 /** * 取值(解引用) * [] * *p 相当于 p[0] * *(p+i) 相当于 p[i] * & 取变量地址 */ // 用循环赋值 // 动态数组 malloc实现的 for (int i = 0; i < n; i++) { p[i] = i; printf_s("%d\t", p[i]); } // 释放内存 free(p); #elif 0 //====================================一维数组================================ /** * 5*10个int数据 * <什么申请就什么释放> */ int dArr[5][10]; // 定义一个二维数组变量 // 指针数组 int* pointArr[5]; // 用循环申请空间 for (int i = 0; i < 5; i++) // 申请空间 { pointArr[i] = (int*)malloc(10 * sizeof(int)); } for (int i = 0; i < 5; i++) { for (int j = 0; j < 10; j++) { pointArr[i][j] = i*j; // *(*(pointArr+i)+j) = i * j; printf_s("%d\t", pointArr[i][j]); } printf_s("\n"); } // 释放内存 for (int i = 0; i < 5; i++) // 释放空间 { free(pointArr[i]); // 什么申请就什么释放 } #elif 0 //===============================二级指针======================= /** * 二级指针 保存一级指针地址 */ //int **pp; // 定义一个二级指针变量 int **pp = (int**)malloc(5 * sizeof(int*)); // 申请一个指针数组的内存 for (int i = 0; i < 5; i++) // 申请内存 { pp[i] = (int*)malloc(10 * sizeof(int)); } // 用循环赋值并且打印 for (int i = 0; i < 5; i++) { for (int j = 0; j < 10; j++) { pp[i][j] = i*j; // *(*(pp+i)+j) = i * j; printf_s("%d\t", pp[i][j]); } printf_s("\n"); } // 循环释放内存 for (int i = 0; i < 5; i++) { free(pp[i]); } free(pp); // 释放内存 #elif 0 //================================数组指针========================= /** * 数组指针(申请堆内存用的不多)和二级指针搭配使用 */ int dArr[5][10]; int(*pDarr)[10]; // 定义一个数组指针 保留列 pDarr = dArr; for (int i = 0; i < 5; i++) { for (int j = 0; j < 10; j++) { pDarr[i][j] = i*j; // 赋值 } } #elif 1 // 指针常量、常量指针 /** * 比如数组名 一直指向数组首地址指针 不能改变指向 指针常量 * * 只能看不能改 * * 数组名不能++ 也不能赋值 */ int n; const double PI = 3.141592654; // 一旦赋值不能修改 定义的时候要同时赋值 // PI = 5.3; 定义之后不能修改 好处 防止程序不小心修改了某个值(类型 比较安全) /* const int *q1; 常量指针 const 在*前面 const 修饰*p *p不能改 int const *q1; int *const q1; // 种是单独一种> 指针常量 *在const前面 const修饰p 说明p不能修改 */ int arr[10] = { 0 }; // 数组 const int *q1; // 常量指针 int *const q2 = arr; // q2要赋初值 常量 <指针常量> /* q2++; // 赋值之后不能修改 指针常量 q2 = &arr[1]; */ *q2 = 5; // 可以修改值 但是不能改指向 q1 = arr; q1++; q1 = &arr[1]; // *q1 = 5; // 不能通过这个去q1去修改它指向的内容 #endif getchar(); return 0; }