专升本 C语言笔记-10 指针数组 和 数组指针

一、数组 和 指针 的区别

数组和指针的介绍
1、指针 是一个变量,它存储了一个内存地址 ,该地址指向一个变量的存储位置。
2、 通过指针,可以访问和修改指向的变量。
3、 数组是一个由相同数据类型元素组成的集合,可以通过索引来访问和修改这些元素。

(1) 存储方式的区别

数组:

数组在内存中是连续存放的,开辟一块连续的内存空间。数组是根据数组的下进行访问的,
数组的存储空间,不是在静态区就是在栈上。

指针:

指针很灵活,它可以指向任意类型的数据。
指针p存储的是一个内存地址,这个地址指向的是某种类型变量的存储空间。
如果要访问这个变量,需要使用指针运算符(*)来引用指针,将指针所指向的地址转换为所指向的变量的值。
指针的值也可以改变,通过指针运算符(&)获取变量的地址,然后将其赋给指针变量。

cpp 复制代码
int a = 3,b = 5, *p = &a;
p = &b;

(2) 赋值方式的区别

同类型指针变量可以相互赋值,数组不行,只能一个一个元素的赋值或拷贝

(3) 占用空间大小

数组的大小取决于数组元素的类型和元素个数
数组所占存储空间的内存:sizeof(数组名)
数组的大小:sizeof(数组名)/sizeof(数据类型)

指针无论是什么类型,在32位平台是占4 byte,在64位平台是占8 byte

(4) 可变性

数组的大小在定义时就已经确定,无法改变,而指针可以随时指向不同的变量,从而实现动态变化。

程序示例

cpp 复制代码
#include <stdio.h>
int main() {
    int a[5] = {1,2,3,4,5};
    int b[5] = {5,4,3,2,1};

    /*
          如果a是个指针变量,则a[i] 永远等价于*(a+i)
     */
    printf("%x\n",a[1]);
    printf("%x\n",*(a+1));

    for (int i = 0; i < 5; ++i) printf("%x\n",&a[i]);
    
    return 0;
}

数组从0开始的原因是地址内存的分配**a[0] 和 a的地址一样**
连续内存地址 例如 a[0] a[1] a[2] a[3]...
a+(下标 * 所占字节)int类型是四个字节

注意
数组a是常量,数组的赋值不能像变量一样赋值, a = b; 是错误的!


二、指针数组 和 数组指针 的区别

指针数组:

指针数组,首先是一个数组,只不过数组的每个元素是一个指针变量。

例:int * p1[10]; 指针数组,[ ]的优先级大于*,p1是一个数组,数组是一个指针类型

cpp 复制代码
//1.指针数组 是一个数组
int a = 3, b =5;
int * p1[2] = {&a,&b};
*p1[0] = 15;    //p1[0]存储的a的地址
printf("a = %d\n",a);

数组指针:

数组指针,首先是一个指针,这个指针指向一个数组

cpp 复制代码
//2.数组指针 是一个指针
//定义一个二维数组
int arr[3][3] = {
                  {2,13,4},
                  {5,6,7},
                  {8,9,10}
                };
//定义数组指针 指向二维数组
int (*p2)[3] = arr;
printf("%d\n",p2[1][2]);
printf("%d\n",*(*(p2+1)+2));

代码意义

p2[1][2] 等价于 *(*(p2+1)+2)
*(p2+1) 等价于 p2[1] 等价于 arr[1]

*(*(p2+1)+2) 等价于 *(p2[1] + 2) 等价于 *(arr[1] + 2) 等于 arr[1][2]

总结

一句话,指针数组是数组,数组指针是指针

相关推荐
微风中的麦穗18 小时前
【MATLAB】MATLAB R2025a 详细下载安装图文指南:下一代科学计算与工程仿真平台
开发语言·matlab·开发工具·工程仿真·matlab r2025a·matlab r2025·科学计算与工程仿真
2601_9491465318 小时前
C语言语音通知API示例代码:基于标准C的语音接口开发与底层调用实践
c语言·开发语言
开源技术18 小时前
Python Pillow 优化,打开和保存速度最快提高14倍
开发语言·python·pillow
学嵌入式的小杨同学18 小时前
从零打造 Linux 终端 MP3 播放器!用 C 语言实现音乐自由
linux·c语言·开发语言·前端·vscode·ci/cd·vim
Aaron158819 小时前
基于RFSOC的数字射频存储技术应用分析
c语言·人工智能·驱动开发·算法·fpga开发·硬件工程·信号处理
mftang19 小时前
Python 字符串拼接成字节详解
开发语言·python
爱编码的小八嘎20 小时前
C语言对话-21.模板特化,缺省参数和其他一些有趣的事情
c语言
jasligea20 小时前
构建个人智能助手
开发语言·python·自然语言处理
kokunka20 小时前
【源码+注释】纯C++小游戏开发之射击小球游戏
开发语言·c++·游戏
童话名剑21 小时前
序列模型与集束搜索(吴恩达深度学习笔记)
人工智能·笔记·深度学习·机器翻译·seq2seq·集束搜索·编码-解码模型