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;
    }
    



  • 相关阅读:
    Atitit.Java exe bat  作为windows系统服务程序运行
    Atitit. Object-c语言 的新的特性  attilax总结
    Atitit. Object-c语言 的新的特性  attilax总结
    Atitit。Time base gc 垃圾 资源 收集的原理与设计
    Atitit。Time base gc 垃圾 资源 收集的原理与设计
    Atitit.go语言golang语言的新的特性  attilax总结
    Atitit.go语言golang语言的新的特性  attilax总结
    Atitit.pdf 预览 转换html attilax总结
    Atitit.pdf 预览 转换html attilax总结
    Atitit.office word  excel  ppt pdf 的web在线预览方案与html转换方案 attilax 总结
  • 原文地址:https://www.cnblogs.com/james1207/p/3279736.html
Copyright © 2011-2022 走看看