zoukankan      html  css  js  c++  java
  • c++指针经典题目分析

    首先看一下题目,下列程序会在那一行崩溃,程序如下:

    #include<iostream>
    
    using namespace std;
    
    struct S{
    	int i;
    	int *p;
    };
    
    int main(){
    	S s;
    	int *p = &s.i;
    	p[0] = 4;
    	p[1] = 3;
    	s.p = p;
    	s.p[1] = 1;
    	s.p[0] =2;
    	return 0;
    }
    

      


    虽然程序很短,但想要理解清楚,还是不容易的,首先先来说几个知识点:

           1.对于struct结构体来说,它所分配的空间是连续的;

           2.p[0]代表p所存储地址的值,关于p[0]这类问题的使用方法,下面会提到的;

    现在开始对程序进行解读:

            首先,*p=&s.i,代表p存储s.i的地址,下面给p[0] = 4,则代表给p所指向的地址赋值为4,也就是s.i = 4;然后是p[1],p[1]代表p所指向地址的下一个地址,在结构体里面地址是连续的,因此p[1]也就指向的是p所指向地址的下一个地址,也就是s.i的下一个地址,也就是s.p,给p[1]赋值也就是给s.p赋值,s.p为指针类型,因此用十六进制表示,所以s.p为0x3;下面是s.p指向p指针(这里两个p有点绕口,但时刻要记得结构体中的p前面带s),那么s.p就指向的是p所指向的地址,也就是s.i,下面是s.p[1] =1,也就是给s.p指向地址的下一个地址赋值,也就是给s.i的下一个地址赋值,也就是给自己赋值,因此将自己的值赋为0x1,也即为s.p指向了0x1这个地址,下面给s.p[0] =2;这个也就是给s.p所指向地址赋值,这样可以成功吗?当然是不行了,s.p指向的地址是什么?是0x1这是一个未作声明的空间,因此程序将会访问出错,也就是在s.p[0]=2;出错;

    下面我们再来看一个关于p[0]的问题:

    #include<iostream>
    
    using namespace std;
    
    void sum(int a[]){
    	a[0] = a[-1] +a[1];
    }
    
    int main(){
    	int a[10] ={1,2,3,4,5,6,7,8,9,10};
    	sum(&a[2]);
    	cout <<a[2]<<endl;
    	return 0;
    } 
    

      


    结果呢?是6,为什么呢?传进去的a[2]的地址,大家也都知道,函数中数组做形参传递的是数组的首地址,因此也就明白了,大概就类似于a[2] =a[1] +a[3];

  • 相关阅读:
    Docker的安装、配置及其基本使用
    Java提升七:注解
    Java提升六:泛型
    Java提升五:反射与动态代理
    MySQL中如何将主键默认值设为UUID()
    图解Mybatis框架原理及使用
    Java提升四:Stream流
    Java提升三:函数式接口
    Java提升二:Lambda表达式与方法引用
    java提升一:内部类
  • 原文地址:https://www.cnblogs.com/gj15991875299/p/4631777.html
Copyright © 2011-2022 走看看