zoukankan      html  css  js  c++  java
  • 指针2

      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]
    ", 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
    ", sizeof(arr[0]));//都一行的大小
     72     printf("arr[0][0]的大小%d
    ", 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 }
  • 相关阅读:
    Aizu
    Aizu
    POJ
    POJ
    POJ
    UVA
    manacher
    Gym
    Gym
    Gym
  • 原文地址:https://www.cnblogs.com/liugangjiayou/p/10556154.html
Copyright © 2011-2022 走看看