zoukankan      html  css  js  c++  java
  • 详解C++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别 (完整代码)

    一、初步了解——指针与取地址

    先看程序:

    #include<cstdio>
    
    int main(void)
    {
    	int num = 7;
    	int *p = &num;
    	printf("%d 的地址是 %p
    ", num, p);
    	return 0;
    }

    上面int *p定义了一个指向int类型指针p(我们使用*符号把p声明为指针),并初始化p使其指向int类型的变量num,这里&num中的&是取地址操作符,当&作用于一个对象上时,它返回了该对象的地址。

    所以这里指针p指向了num所对应的地址。(我测试时输出了0028FF1C)


    二、如何使用指针?——解引用与指针赋值

    #include<cstdio>
    
    int main(void)
    {
    	int num = 7;
    	int *p = &num;
    	printf("数值%d所在的地址是 %p
    ", num, p);
    	printf("指针p所指向的地址为 %p , 该地址上所保存的值为%d
    ", p, *p);
    	*p = 100;
    	printf("指针p所指向的地址为 %p , 该地址上所保存的值为%d
    ", p, num);
    	return 0;
    }

    注意这里*操作符为解引用操作符,它返回指针p所指的地址所保存的值。

    我们可以对*p赋值,从而改变p所指的地址上说保存的值,从而改变指向此地址的变量num的值。(num的值变为100)

    当然,我们也可以给指针p赋值,使其指向另外一个地址:

    #include<cstdio>
    
    int main(void)
    {
    	int num = 7, another = -5;
    	int *p = &num;
    	p = &another;
    	printf("%d
    ", *p);//-5
    	return 0;
    }
    


    三、引用

    从某种意义上来说,引用完全有别于上面说介绍的内容:

    #include<cstdio>
    
    int main(void)
    {
    	int val = 7, val2 = 999;
    	int &refval = val, &refval2 = val2; ///引用必须要初始化,使其绑定到一个变量上
    	///修改引用的值将改变其所绑定的变量的值
    	refval = -12;
    	printf("%d %d
    ", val, refval);//-12,refval的值和val一样
    	
    	///将引用b赋值给引用a将改变引用a所绑定的变量的值,
    	///引用一但初始化(绑定),将始终绑定到同一个特定对象上,无法绑定到另一个对象上
    	refval = refval2;
    	printf("%d %d
    ", val, refval);//999
    	return 0;
    }
    

    四、补充

    a)指向指针的指针:

    #include<cstdio>
    
    int main(void)
    {
    	int val = 7;
    	int *p = &val;
    	int **p2 = &p;///**声明一个指向指针的指针
    	printf("val的值为%d %d",*p,**p2);///**p2为两次解引用,可看做*(*p2)
    	return 0;
    }

    由于指针也要占用内存空间存放其值,所以我们也可以定义一个指向指针的指针。


    b)指针与数组:

    指针和迭代器非常像,我们可以说指针就是数组的迭代器:

    #include<cstdio>
    
    int val[100];
    
    int main(void)
    {
    	for (int i = 0; i < 100; ++i)
    		val[i] = i;
    	int *p = val;///等价于int *p = &val[0];
    	///数组的变量名就是一个指针
    	printf("%d
    ", *p); ///指针p指向val的第一个元素,即val[0]
    	
    	int t = 100;
    	while (t--)
    		///可以直接对指针进行加减运算,就和迭代器一样
    		printf("%d
    ", *(p++));///输出0~99
    		
    	///指针可以做差:
    	int *p2 = &val[10], *p3 = &val[20];
    	printf("%d
    ", p3 - p2); //10
    	printf("%d
    ", p2 - p3); //-10
    	
    	///还可以比比较大小:
    	printf("%d
    ", p2 < p3 ? p3 - p2 : p2 - p3); //10
    	return 0;
    }
    


    对于多维数组,只要把指向指针的指针理解好了就行:

    #include<cstdio>
    
    int val[100][100];
    
    int main(void)
    {
    	val[2][1] = 666;
    	///如何用指针取出val[2][1]?
    	printf("%d", *(*(val + 2) + 1));
    	return 0;
    }
    



  • 相关阅读:
    在知识爆炸的年代如何学习,避免成为PPT架构师
    同城双活的概念
    随笔《一个程序猿的生命周期》- 逆潮流而动的“叛逆者”
    连载《一个程序猿的生命周期》- 第1册《生存》篇全集 下载
    连载《一个程序猿的生命周期》- 44.感谢,我从事了IT相关的工作
    连载《一个程序猿的生命周期》- 43.我被这个时代淘汰了吗? ---2016年开篇,春节祝福!!!
    连载《一个程序猿的生命周期》- 42.新公司这一年,我都发生了哪些变化。--- 年底干货总结!!!
    连载《一个程序猿的生命周期》- 41.一个时代有一个时代人的使命
    【转载、推荐】不要自称是程序员,我十多年的 IT 职场总结
    [群友反馈] 程序猿身上的缺点
  • 原文地址:https://www.cnblogs.com/james1207/p/3279736.html
Copyright © 2011-2022 走看看