zoukankan      html  css  js  c++  java
  • iOS 阶段学习第八天笔记(指针)

    iOS学习(C语言)知识点整理

    一、指针

    1)概念:存储变量的地址的一个变量。

    2) 数据存储类型分析

       1、text (代码段) :存储二进制的可执行代码

       2、data(初始化的数据段) 存储初始化的全局变量以及初始化的static修饰的变量,分为只读数据段

         (如:字符串常量,整型常量)及可读可写数据段,静态存储。

       3、data(未初始化的数据段)存储未初始化的全局变量及未初始化的static修饰的变量,静态存储。

       4、heap(堆区) 内存使用需要手动申请,手动释放,空间非常大,通常存储大容量的数据,执行效率比较低

           使用比较麻烦,动态存储。

     5、stack(栈区)内存空间比较小,函数调用局部变量开辟都是栈上,使用效率非常高。

    3)取地址符 “&”,间接寻址符 “ * ”,“%p” 打印地址的格式字符

    4)指针标示符:* 例如: int *p   表示定义了一个指针p,*是指针标示,int表示p指向的类型(里面存储的是int型变量的地址)

    5)各种类型的指针,在内存中拥有的空间都是一样的,64位系统下面都是8个字节(32位是4个字节)。 

    6)指针运算 指针对象 ++,表示指向地址向后偏移,偏移量为sizeof(指向的类型);- -则表示向前偏移。

    7)野指针:未初始化值的指针,里面是个随机地址,可以任意修改该地址对应的值,会给系统造成不可控制的影响。

    8)空指针 p=NULL=0; 0是非法地址,0地址不可赋值,不可读写。

    9)指针的优点

       1、为函数提供修改调用变量的灵活手段

       2、可以使函数有多个返回值

       3、可以改善某些子程序的效率 ,在传递数据时,如果数据块较大(比如数据缓冲区域或比较大的结构),这时就可使用指针传递地址而

            不是实际数据,即可提 高传输速度,又节省大量内存。

      4、为动态数据结构(如 二叉树、链表)提供支持。

    10)void* 指针,通配指针,可是指向任意类型。

    11)指针的应用,函数中指针作为函数的入参。

    12)int *a;  指针变量,指向int型数据。

    13)指针数组  即指向一个数组类型的指针   

           例如: int *p[4] : 表示4个指向int的指针.每个指针都是独立的,没有关系; p[i] 是一个 int 型指针

           p[i]=*(p+i)

     实例代码:

     1 int add(int *a[],int len1,int len2)
     2 {
     3     int sum = 0;
     4     for(int i=0;i<len1;i++){
     5         //a[i]第i个指针=第i个一维数组
     6         for(int j=0;j<len2;j++){
     7             sum = sum + *(a[i]+j);
     8         }
     9     }
    10     return sum;
    11 }
    12 
    13 int main()
    14 {
    16     int a[4][3]={{1,2,3},{4,5,6}, {7,8,9},{10,11,12}};
    17     int *p[4];//指针数组,没初始化不能用,野指针组
    18     for(int i=0;i<4;i++){
    19         p[i]=a[i];//a[i]表示第i行的一个数组
    20     }
    22    int sum = add(p,4,3);
    23    printf("sum = %d
    ",sum);
    24    return 0;
    25 }

    14)数组指针 

    实例代码:

     1 int add(int(*p)[3],int len)
     2 {
     3     int sum = 0;
     4     for(int i=0;i<len;i++){
     5         //p+i 表示指向第i个数组 *(p+i)=a[i]
     6         for(int j=0;j<3;j++){
     7         //a[i][j] = *(a[i]+j) = *(*(p+i)+j)
     8             sum = sum + *(*(p+i)+j);
     9         }
    10     }
    11 
    12     return sum;
    13 }
    14 
    15 int main()
    16 {
    17     int a[4][3]={{1,2,3},{4,5,6}, {7,8,9},{10,11,12}};
    19     //a[0],a[1],a[2],a[3]:4个数组都有3个元素
    21     int(*p)[3];//可以指向一个有3个元素的数组
    23     //p = &(a[0]);//&a[0] = &(*(a+0))
    25     p = a;//由上面的那个式子化简
    27     int sum =add(a, 4);//既然p=a,就可以这么写
    29     printf("sum %d 
    ",sum);
    31  }

    15)函数指针  int (*pfunc)(int,int); 定义了一个函数指针,必须要指向 int XXX(int a,int b) 这种样式的函数

     实例代码:

     1 int add(int a,int b)
     2 {
     3       return a+b;
     4 }
     5 
     6 int main(){
     7     int a = 10;
     8     int b = 20;
     9     int sum;
    10     int (*pfunc)(int,int);
    11 
    12     pfunc = add;//函数名相当于一个指向其函数入口指针常量
    14     sum = pfunc(a,b);
    16     printf("sum = %d
    ",sum);
    18     return 0;
    20 }

    16) 使用指针 实现函数回调

     实现代码:

     1  void print_hello()
     2 {
     3     printf("hello world
    ");
     4 }
     5 
     6  void print_date()
     7 {
     8     time_t rawtime;
    10     struct tm * timeinfo;
    12     time ( &rawtime );
    14     //获取系统本地时间 需要引用 time头文件 ,#include <time.h>
    16     timeinfo = localtime ( &rawtime );
    18      printf ( "%4d-%02d-%02d %02d:%02d:%02d
    ",1900+(*timeinfo).tm_year, 1+(*timeinfo).tm_mon,
    20             (*timeinfo).tm_mday,(*timeinfo).tm_hour,(*timeinfo).tm_min,(*timeinfo).tm_sec);
    22 }
    23 
    24 // void(*pfunc)()
    25 void print_all(void(*pfunc)(),int count)
    26 {
    27     for(int i=0;i<count;i++){
    28         pfunc();
    29     }
    31 }
    33  
    34 int main()
    35 {
    37     print_all(print_date,4);//循环输出4次
    39     print_all(print_hello,1);
    41     return 0;
    42 }

    17)使用指针实现递归算法

     实现代码:

    void sort_array(int *a,int len){
       //冒泡排序
       int temp;
       for(int i=0;i<len-1;i++){ 
            for(int j=0;j<len-1-i;j++){
             if(*(a+j)>*(a+j+1))
                {
                   temp = *(a+j);
                   *(a+j) = *(a+j+1);
                  *(a+j+1) = temp;
                 }
             }
         }
    }
    int main(){ int a[5]={1,20,30,4,5}; int *p; p = a; //传递数组:2种形式 数组或者指针 print_array(a, 5); return 0; }

    18)二级指针 指向指针的指针。

     实例代码:

     1 void swap(int **p,int **q)
     2 {
     4     int temp;
     6     temp = **p;
     8     **p = **q;
    10     **q = temp;
    12 }
    13  
    15 int main()
    16 {
    18     int a = 10;
    20     int b = 20;
    22     int *p = &a;//p是一个指针,指向int型
    24     int **q;//q是一个指针,指向 int *型,int* 型就是指向int的指针类型,p就是这样一个类型
    26     q = &p;//*q=*(&p)=p
    28     printf("%d
    ",**q);//*q=p,**q=*p=a
    30     int *p_b = &b;
    32     int **pp_b = &p_b;
    34     swap(q,pp_b);
    36     printf("a=%d,b=%d
    ",a,b);
    38     return 0;
    39 }

    19)const 修饰符,只读  表现形式: const 数据类型 变量名 ,const 直接修饰的变量不可以改变,但加了*的变量可修改。

     实例代码:

     1 int main()
     2 {
     4     int value1 = 10;
     6     int value2 = 20;
     8     const int a = 100;
    10     printf("a=%d
    ",a);
    12     a = 20;//const修饰的变量不能修改
    14     const int *p = &value1;
    16     p = &value2;
    18     //*p = 100;//*p不可以修改,p可以改
    20     int const *m = &value1;
    22     m = &value2;
    24     //*m = 10;//*m不可以修改,m可以改
    26     int *const n;//n不可以改,*n可以改
    28     const int *const q//q不可以改,*q不可以改
    30     const int *const m,*n;//m,*m不可以改,n可以改
    32     *n =100;//*n也不可以改
    34     const int *const m, *const n;//m,*m,n不可以改
    36     *n = 100;//*n也不可以改
    38     int *const m, *const n;//m,n不可以改,*m,*n可以改,
    40     *n = 100;
    41 }

     

  • 相关阅读:
    oracle 静默安装
    浅析hybrid模式下地支付宝钱包和微信
    LeetCode96_Unique Binary Search Trees(求1到n这些节点能够组成多少种不同的二叉查找树) Java题解
    hdu 5411 CRB and Puzzle 矩阵高速幂
    Hadoop作业性能指标及參数调优实例 (三)Hadoop作业性能參数调优方法
    实现Android4.4系统设置分页滑动浏览功能
    oracle 数据库中数据导出到excel
    Nginx配置upstream实现负载均衡
    公司须要内部的地图服务,准备自己去开发可是成本太高,如今有没有专门为企业提供GIS地图开发的产品呀?大概价格多少?
    图片在内存中的占用的空间大小
  • 原文地址:https://www.cnblogs.com/ChinaKingKong/p/4604934.html
Copyright © 2011-2022 走看看