码迷,mamicode.com
首页 > 其他好文 > 详细

指针2

时间:2019-03-19 01:15:19      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:for   效率   getc   oid   用法   char*   数组的数组   完全   10个   

  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 }

 

指针2

标签:for   效率   getc   oid   用法   char*   数组的数组   完全   10个   

原文地址:https://www.cnblogs.com/liugangjiayou/p/10556154.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!