• 指针数组与数组指针的区别



    一、指针概念

    • 内存会划分为一个个内存单元,指针是内存中一个最小单元的编号,也就是地址。
    • 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量。
    • 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
    • 指针的大小是固定的4/8个字节(32位平台/64位平台)。
    • 指针是有类型,指针的类型决定了指针的±整数的步长,指针解引用操作的时候的权限。 指针的运算。
      指针需要存储到变量中,被称为指针变量。

    指针大小的理解指针的大小是固定4/8字节32位平台/64位平台)是由物理的32/64根电线产生,由32/64个0-1组成的二进制序列作为地址,需要32/64个bit位才能存储这些地址(因为8个bit位为一个字节所以指针的大小才是4/8个字节

    总结:数组名 == 地址 ==指针


    二、指针

    1.0、字符指针

    字符指针的基本运用

    int main()
    {
    	//ch初始化
        char ch = 'a';
        //把ch地址取放到*pc
        char *pc = &ch;
        //解引用pc可以修改ch,因为pc存放着有ch的地址
        *pc = 'b';
    	
    	//const限制*p修改,存放在代码区是不能被修改
    	const char *p="abcdf";
    	//%s,因为数组在内存中是连续存放的,只要给了p的地址,就会依次打印整个数组
    	printf("%s\n",p);
    	//打印首字符
    	printf("%c\n",*p);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    练习:

    #include 
    int main()
    {
    	//str1,str2数组都是独立的内存空间,所以是false
        char str1[] = "hello bit.";
        char str2[] = "hello bit.";
        //*str3,str4常量字符串不允许被修改,只要是相同的常量字符串,在内存中只需要创建一块内存空间,因为地址相同所以是true
        const char *str3 = "hello bit.";
        const char *str4 = "hello bit.";
        if(str1 ==str2)
    		 printf("str1 and str2 are same\n");
        else
    		 printf("str1 and str2 are not same\n");
          
        if(str3 ==str4)
    		 printf("str3 and str4 are same\n");
        else
    		 printf("str3 and str4 are not same\n");
          
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    2.0、指针数组与数组指针

    区分指针数组与数组指针的方法,还是得看优先级()>[ ]>*,
    (*p)[n]:根据优先级,先看括号内,则p是一个指针,这个指针指向一个一维数组,数组长度为n,这是“数组的指针”,数组指针就是指向数组的指针;
    *p[n]:根据优先级,先看[],则p是一个数组,再结合 *,这个数组的元素是指针类型,共n个元素,这是“指针的数组”,指针数组是存放指针的数组。

    总结:先看优先级区分,数组指针就是指向数组的指针,指针数组是存放指针的数组。

    数组指针的基本运用

    //用指针模拟二维数组
    #include
    
    //传过来的二维数组,需要用数组指针接收
    void Print(int(*p)[5], int r, int c)
    {
    	int i = 0;
    	for (i = 0; i < r; i++)
    	{
    		int j = 0;
    		for (j = 0; j < c; j++)
    		{
    			//指针的结合主要还是看优先级,从左往右,()高于*所以先是第一个大括号,内部也是同理,区别就是同一优先级从左往右先(p+i)然后解引用在到+j
    			printf("%d ", *(*(p + i) + j));
    		}
    		printf("\n");
    	}
    }
    int main()
    {
    	int arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
    	
    	Print(arr, 3, 5);
    
    	return 0;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    指针数组

    int main()
    {
    	int a = 1;
    	int b = 2;
    	int* p1= &a;
    	int* p2= &b;
    	int* p[2] = { p1,p2 };
    
    	printf("%p\n", p[0]); //a的地址
    	printf("%p\n", &a); //a的地址
    	printf("%p\n", p[1]); //b的地址
    	printf("%p\n", &b); //b的地址
    	printf("%d\n", *p[0]); //*p[0]相对应的下标的元素
    	printf("%d\n", *p[1]); //*p[1]相对应的下标的元素
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    三、数组参数与指针参数

    1.0、一维数组传参

    //一维数组传参,形参部分可以是数组也可以是指针
    void test1(int arr[5],int sz)
    {}
    
    void test2(int* p,int sz)
    {}
    
    int main()
    {
    	int arr[5] = { 0 };
    
    	test1(arr, 5);
    	test2(arr, 5);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2.0、二维数组传参

    void test1(int arr[4][4],int r,int c)	//二维数组形参部分,行可以省略,列不能省略
    {}
    void test2(int(*p)[4],int r,int c)		//二维数组传参,形参部分要想用指针接收,就得用数组指针接收,因为传过来的是二维数组首元素的地址,也就得用指针接收
    {}
    void test2(int **p)		//指针数组的元素都是指针类型,要想接收指针数组就得用二级指针,因为二级指针可以存放一级指针
    {}
    int main()
    {
    	int arr[4][4] = { 0 };
    	int *arr2[20]={0};		//指针的数组,数组元素为指针类型
    	test1(arr, 4, 4);
    	test2(arr, 4, 4);
    	test3(arr2);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    基于JavaWeb+SSM+Vue“鼻护灵”微信小程序系统的设计和实现
    Spring Boot 创建项目 / 目录介绍 / 配置文件
    springboot项目打包成jar
    DSPE-PEG-Aldehyde,DSPE-PEG-CHO,磷脂-聚乙二醇-醛基MW:1000
    Ansible学习笔记09-剧本中使用变量2
    Spark中宽依赖、窄依赖、Job执行流程
    设备通过thingsboard iot gateway 来获取属性和更新属性
    安装vue vue-server-renderer报错
    CDN加速怎么实现缓存Range请求
    Uniapp自定义启动图在线生成storyboard(适用于Uniapp)
  • 原文地址:https://blog.csdn.net/m0_66977204/article/details/130891606