1 /*
2 基本数据 int x---->实参 写整数或者整型变量
3 变量地址 修改变量的值 int *px 实参 变量地址
4 数组名 想要操作一位数组 int *px/int arr[] 实参
5
6
7
8 2.堆内存的申请 内存四区 代码区 全局静态常量区 栈区 堆区
9 堆区 内存大 但是需要手动申请释放
10
11 int *p;
12 p=(int*)malloc(sizeof(int)*100);申请一端内存
13
14 p[i] 访问下标为i的元素*(p+1)
15
16 free(p);//释放内存
17 sizeof(int) 4个字节
18 对于不同的系统 不同环境下 数据的大小 不是完全一致的
19 对于类型的大小 统一用sizeof就行
20
21 char*str="hello world";
22 gets(str);错误的
23 平时 栈区
24 大量数据 ---->堆区
25 全局共享的数据 用全局变量/传参的方式
26
27 二维数组叫做数组的数组
28 新内容
29 1 指针数组和数组指针
30 2 指针常量和常量指针
31 3 指针函数和函数指针
32
33
34 */
35 #include<stdio.h>
36 #include<stdlib.h> //malloc free realloc
37 /* 查找行最小 列最大的元素 找到后直接打印 */
38 void fun1(int arr[][4], int row)//二维数组 传参需要传递行
39 {
40 int m, n;
41 for (int i = 0; i < row; i++)//有多少行就找多少次
42 {
43 //查找一次的过程 查找这一行的最小值
44 m = 0;//列从0开始的
45 for (int j = 0; j < 4; j++)
46 {
47 if (arr[i][j] < arr[i][m])//m表示这一行最小元素 列数
48 {
49 m = j;
50 }
51 }
52 //arr[i][m]是这一行的最小元素
53 //找一下这一列有没有比arr[i][m]更大的元素
54 for (n = 0; n < row; ++n)//arr[0][m] arr[2][m]
55 {
56 if (arr[n][m]>arr[i][m]) break;
57 }
58 if (n == row)
59 {
60 printf("所求的点是[%d,%d]\n", i, m);
61 }
62 }
63 }
64 void test()
65 {
66 int arr[3][4] = { //arr有三个元素 arr[0] arr[1] arr[2]
67 9, 7, 4, 5, //arr[0]有四个元素arr[0][0] arr[0][1] arr[0][2] arr[0][3]
68 7, 7, 3, 2,
69 1, 0, 2, 9
70 };
71 printf("arr[0]的大小%d\n", sizeof(arr[0]));//都一行的大小
72 printf("arr[0][0]的大小%d\n", sizeof(arr[0][0]));
73 //一级指针和一维数组
74 //int brr[10] p=brr//p指向第一个元素
75 //p=&brr[0];
76
77
78 //二维数组 q=qrr;
79 //q=&arr[0] 取第一行的地址 (取第一个元素地址)
80 //第一个元素 是一个数组 需要用到数组指针 (指向数组的指针)
81 //指向的数组 存什么类型的数据
82 int(*pd)[4];//一行内容 指向数组的指针 数组指针
83 //行指针
84 pd = arr;//指向第一行
85 (*pd)[0];//相当于第一行的第一个元素 pd[0][0]
86 pd[1][2];//都二行第三个元素
87 //定义数组指针 然后指向数组之后 用法和数组是一样
88 //数组指针的意义
89
90
91
92 fun1(arr, 3);//表示数组有三行
93 //行最小 列最大 用循环一个一个去比较
94 //----->找到每一行中的最小值 用循环一个个比较
95 // 然后判断是不是这一列的最大值
96 //int brr[4];
97 //pd = &brr;
98 //pd = &brr[0];
99 //pd[0][0]---->brr[0]
100
101
102 //int x;
103 //double y;
104 //int *px;
105 //px=&y;
106 }
107 void test1()
108 {
109 //如果我要一个指针 int *p;
110 //如果使用多个指针 指针数组
111 //类型 数组名[数组大小]
112 int* pArr[10];//指针数组 10个int*
113 //一个指针可以申请一段内存 多个指针 申请多个内存
114 for (int i = 0; i < 10; ++i)
115 {
116 pArr[i] = (int*)malloc(sizeof(int)* 4);
117 }
118 //申请之后相当于一个二维数组10行4列
119 //用法和二维数组是一样的
120 pArr[1][3];//第二行 第四个元素
121
122 for (int i = 0; i < 10; ++i)
123 {
124 free(pArr[i]);
125 }
126 }
127 void test2()//指针常量和常量指针
128 {
129 //const 常属性的意思 不可变(定义的还是变量)
130 int const x = 10;//通过 语法限定 x的值不可修改 必须先定义然后赋值
131 //限定x不能作为左值 栈区 const int x 效果一样
132 int arr[10];
133 const int* p;//int* const q; //const限定了这个p不能区修改它指向的内容
134 p = &arr[0];//先让p指向第一个元素
135 //*p = 0;//相当于 arr[0]=0
136 //p++;
137 //const在前*在后 常量指针
138 //const修饰的是*p *p不可修改 p不能修改其他值
139 int* const q=&arr[0];
140 //q = &arr[0];//q不能赋值
141 *q = 0;//说明可以指针q去修改的指向的内容
142
143 //const在*后面 指针常量
144
145 //const修饰是q 说明q不可以修改(不能修改q的指向)
146
147 //使用指针传参 为了效率 修改形参的值
148 char *str = (char*)malloc(sizeof(char)* 100);
149 str = "hello world";//字符串赋值 必须strcpy
150 //让指针指向这个字符串(常量区)
151 //后续释放就没法申请的内存 指针指针已经变了
152 free(str);
153
154 }
155 void test3()//指针函数和函数指针
156 {
157 //指针函数 返回值为指针的函数 malloc作用申请内存 返回是一个指针
158 //函数指针 指向函数的指针
159 //函数调用过程 函数 ---->函数 传递形参 计算 得到返回值--->回到主函数
160
161 void * (*pfun)(size_t _Size);//先复制函数声明--->函数名缓冲(*p)
162 pfun = malloc;//函数指针的赋值
163 //pfun指向函数的地址 --->可以用pfun区调用这个函数
164
165 int*p = (int*)pfun(100 * sizeof(int));
166 free(p);
167 //函数名作为函数 传递给其他函数
168 //实参是函数名 形参 就是函数指针
169 //指针 可以指向一类函数
170 }
171 void test4()
172 {
173 int *p; //int
174 int *p2[10];// 类型 数组名[数组大小]
175 int(*p3)[10];//int [10] 指向这么一个数组 数组指针
176 //如果实参是二维数组 形参如何写?
177 int(*p4)[3][4];//和三维数组有关 不用考虑
178 }
179 int main()
180 {
181 test();
182 test1();
183 test2();
184 test3();
185 test4();
186 getchar();
187 return 0;
188 }