zoukankan      html  css  js  c++  java
  • 指针强化

    多级指针

    多级指针案例1

    # include <stdio.h>
    
    int main(void)
    {
    	int i = 10;
    	int * p = &i;  //p只能存放int类型变量的地址
    	int ** q = &p;  //q是int **类型,所谓int**类型就是指q只能存放int*类型变量的地址, 	
    	int *** r = &q;  //r是int***类型, 所谓int***类型就是指r只能存放int ** 类型变量的地址 
    
    	//r = &p;  //error 因为r是int *** 类型,r只能存放int **类型变量的地址
        //输出结果是10  只有 ***r才表示的是i, *r或 **r或 ****r代表的都不是i
    	printf("i = %d
    ", ***r); 
    
    	return 0;
    }
    

    多级指针案列2

    #include <stdio.h>
    
    //多级指针在函数中的应用
    void fmax(int ** q)
    {
    	**q = 100;	//*q就是p
    }
    
    void gmin()
    {
    	int i = 10;
    	int * p = &i;
    	printf("i = %d  *p = %d
    ", i, *p);
    
    	fmax(&p); //p是int *类型	&p就是int ** 类型
    	
    	printf("i = %d  *p = %d
    ", i, *p);
    }
    
    int main(void)   
    {
    	gmin();
    	return 0;
    }
    

    静态变量不能跨函数使用

    1. 内存越界:程序访问了一个不该被访问的内存,函数内的静态空间,不能被其他函数调用访问。
    2. 函数中的内存空间,随函数终止而被释放。内存空间释放后的内容不属于其他函数,其他函数无权限访问。但释放后的内存空间的地址是可以被其他函数读取的。
    3. 但指针变量可以存贮任何函数中静态内存空间的地址,p都能存垃圾,p想存谁存谁。只是它此时已经没有权限读取(访问)i这个地址的数据了,出错。

    代码示例

    # include <stdio.h>
    
    void fmin(int ** q) //q是个指针变量,无论q是什么类型的指针变量,都只占4个字节
    {
    	int i = 5;
    	//*q等价于p  q和**q都不等价于p
    	//*q = i; //error 因为*q = i; 等价于 p = i; 这样写是错误的
    	*q = &i;  // p = &i;
    }
    
    int main(void)
    {
    	int *p;  
    	
    	fmin(&p);
    	printf("%d
    ", *p);  // 本语句语法没有问题,但逻辑上有问题
    
    	return 0;
    }
    

    动态内存可以跨函数使用案例

    # include <stdio.h>
    # include <malloc.h>
    
    void fmax(int ** q) //*q等价p 已经声明了q的类型为int **
    {
    	*q = (int *)malloc(sizeof(int)); //sizeof(数据类型) 返回值是该数据类型所占的字节数
    			//等价于 p = (int *)malloc(sizeof(int));
    	//q = 5; //error
    	//*q = 5; //p = 5;
    	**q = 5; //*p = 5;
    }
    
    int main(void)
    {
    	int * p;
    
    	fmax(&p);    //只有调用变量的地址,才能改变变量的值
    	printf("%d
    ", *p);  
    	
    	//fmax函数中,没有free(q);所以动态空间仍然保留,动态空间中的内容可以被访问
    	return 0;
    }
    
  • 相关阅读:
    java web图片显示到浏览器
    Spring MVC + jpa框架搭建,及全面分析
    spring常用jar包总结(转载)
    搭建基于Maven的SSM框架
    线程同步的几种方法
    HttpServlet容器响应Web客户流程
    forword 与 redirect
    Hibernate状态转换
    String StringBuffer StringBuilder 对比
    位运算符
  • 原文地址:https://www.cnblogs.com/Guard9/p/12905113.html
Copyright © 2011-2022 走看看