• c语言-浅谈指针(2)



    本篇文章是关于数组与指针的,在上一篇指针内容的基础上进一步了解指针

    1.数组名的理解

    我们先来了解一个知识点:在给指针变量赋值时,数组用数组名赋给指针变量相当于&arr[0]. 也就是说数组名就是数组的首地址

    我们来验证一下:

    int main() {
    	int arr[5] = { 0 };
    	printf("%p\n", arr);
    	printf("%p\n", &arr[0]);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行结果:
    在这里插入图片描述

    两个一样,说明了数组名就是数组的首地址

    但是有两个例外:
    1.就是在求数组长度时,sizeof(arr)–这里的数组名代表的是整个数组
    2.就是在给数组名取地址时,&arr,这时取的时整个数组的地址

    我们来验证一下:

    int main() {
    	int arr[5] = { 0 };
    	int t = sizeof(arr);//计算数组大小
    	printf("arr=%p\n", arr);
    	printf("&arr[0]%p\n", &arr[0]);
    	printf("&arr=%p\n", &arr);
    	printf("arr+1=%p\n", arr+1);//数组内加1
    	printf("&arr+1=%p\n", &arr+1);//整个数组加1
    	printf("arr=%d\n", t);//打印数组大小
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果:
    在这里插入图片描述

    1.我们先分析一下数组大小,从运行结果来看计算结果为20,刚好是这个数组的大小,也验证了我们的第一条。
    2.我们再来分析一下前三个结果,它们都一样,是因为这里打印的都是第一个地址,有区别的是后面两个,它们在原来数组大小的基础上加 1 ,但是结果却不同,arr+1只加了4,而&arr+1却多了20,所以可以说明&arr取得是整个数组地址

    2.使用指针访问数组

    有了前面得知识做铺垫,那么我们接下来来使用指针去访问数组吧
    我们通过指针去访问数组是将这个数组得首地址赋给指针,再通过指针得解引用去逐个去访问数组的元素,接下来通过代码演示一下吧

    int main() {
    	int arr[5] = { 1,2,3,4,5 };
    	int* p = arr;//给首地址
    	for (int i = 0; i < 5; i++) {
    		printf("%d ", *(p + i));//利用指针打印
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    图解:
    在这里插入图片描述
    运行结果:
    在这里插入图片描述

    实质:

    在编码时会将 arr [ 0 ]转化为 *(arr+0).那么p是不是也可以写成这样呢 p [0] ,答案是:是的,因为它最后也会转化为 *(p+0),那么是不是也会写成这样呢 0[arr],答案也是:是的,因为最后都会转化,那么通过代码来验证一下

    int main() {
    	int arr[5] = { 1,2,3,4,5 };
    	int* p = arr;//给首地址
    	printf("%d ", *(arr + 0));
    	printf("%d ", p[1]);
    	printf("%d ", 3[arr]);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    运行结果:

    在这里插入图片描述
    耶,验证成功

    补充:

    当利用指针输入时不用加 * ,因为指针变量本身就是一个地址

    如:

    scanf("%d",p)
    • 1

    3.一维数组传参的本质

    一维数组传参的本质就是传首地址

    接下来通过代码验证一下

    void  te(int arr[]) {
    	int r = sizeof(arr) /sizeof(arr[0]);
    	printf("r=%d\n", r);
    }
    int main() {
    	int arr[10] = { 0 };
    	int t = sizeof(arr)/sizeof(arr[0]) ;
    	te(arr);
    	printf("t=%d", t);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果:
    在这里插入图片描述

    分析:

    r=1说明传过去的只有1个元素,也就是说传过去的第一个元素的地址(首地址),
    而t=10说明数组有10个元素,是数组全部的元素,就是说是整个数组的地址

    利用指针接收数组
    可以用一个指针变量接收数组(因为传的就是首地址)
    如:

    void  te(int *p) {
    	
    }
    int main() {
    	int arr[10] = { 0 };
    	
    	te(arr);
    	
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    之后就是根据上面那样利用指针去访问数组 了

    4.二级指针

    指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪⾥?那就是二级指针 简单来说就是接收一级指针的

    如:

    int main() {
    	int a=10;
    
    	int* p = &a;
    	int** pp = &p;
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    图解:
    在这里插入图片描述

    *pp 通过对pp中的地址进⾏解引⽤,这样找到的是 p , *pp 其实访问的就是 p
    而 * *pp就是访问a了>>> *pp找到p>>再对p解引用 访问a

    运算

    //a=30
    //p=&a
    //*p=a
    //*pp=p
    **pp= 30;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    5.指针数组

    指针数组是指针还是数组?
    我们类⽐⼀下,整型数组,是存放整型的数组,字符数组是存放字符的数组。 那指针数组呢?是存放指针的数组。

    图类比
    在这里插入图片描述

    在这里插入图片描述

    指针数组的每个元素是地址,⼜可以指向⼀块区域。

    例:
    指针数组模拟⼆维数组
    代码实现:

    #include 
    int main()
    {
     int arr1[] = {1,2,3,4,5};
     int arr2[] = {2,3,4,5,6};
     int arr3[] = {3,4,5,6,7};
     //数组名是数组⾸元素的地址,类型是int*的,就可以存放在parr数组中
     int* parr[3] = {arr1, arr2, arr3};
     int i = 0;
     int j = 0;
     for(i=0; i<3; i++)
     {
     for(j=0; j<5; j++)
     {
     printf("%d ", parr[i][j]);
     }
     printf("\n");
     }
    return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述
    parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型⼀维数组,parr[i][j]就是整型⼀维数组中的元素。

    与真正二维数组的区别
    真正的二维数组的地址是连续的而指针数组模拟⼆维数组的地址是不连续的

    以上就是我的分享了
    谢谢大家观看,如果对你有帮助的话,点点赞和关注哦

  • 相关阅读:
    【MATLAB教程案例11】基于PSO粒子群优化算法的函数极值计算matlab仿真及其他应用
    java 八股文 基础 每天笔记随机刷
    CloudService计算类技术和网络类技术以及存储类技术的基础学习
    在 Transformers 中使用对比搜索生成可媲美人类水平的文本 🤗
    解析mfc100u.dll文件丢失的修复方法,快速解决mfc100u.dll问题
    【考研数学】概率论与数理统计 —— 第二章 | 一维随机变量及其分布(2,常见随机变量及其分布 | 随机变量函数的分布)
    【毕业设计】基于大数据的京东消费行为分析与可视化 - python 机器学习
    【ROS】Nav2源码之nav2_behavior_tree详解
    五、JAVA基本数据类型
    GBase 8c 存储技术---内存引擎(三)
  • 原文地址:https://blog.csdn.net/2302_79539362/article/details/134439811