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;
    
    }
  • 相关阅读:
    InChatter系统之服务器开发(一)
    InChatter系统开源聊天模块前奏曲
    System.Lazy<T>延迟加载
    系统的层级架构
    Android网络通信库Volley简介(转)
    switch case 忘记 break
    switch case 忘记 break
    C# Lock 解读
    JSON资料整理(转载)
    [Leetcode]253. 会议室 II(数组/堆)
  • 原文地址:https://www.cnblogs.com/zsq1993/p/5977812.html
Copyright © 2011-2022 走看看