当前位置: 首页 > news >正文

[C语言]指针和数组

目录

1.数组的地址

 2.通过指针访问数组

3.数组和指针的不同点

 4.指针数组


1.数组的地址

数组的地址是什么?

看下面一组代码

#include <stdio.h>
int main()
{
int arr[5] = {5,4,3,2,1};
printf("&arr[0] = %p\n", &arr[0]);
printf("arr     = %p\n", arr);
return 0;
}

 运行结果:

从上面代码中可以看到数组名和首元素的地址和是一样的

但是有不同的情况

举例:

#include <stdio.h>
int main()
{int arr[6] = { 5,4,3,2,1,0 };printf("&arr[0]   = %p\n", &arr[0]);printf("&arr[0]+1 = %p\n\n", &arr[0]+1);printf("arr       = %p\n", arr);printf("arr+1     = %p\n\n", arr+1);printf("&arr      = %p\n", &arr);printf("&arr+1    = %p\n\n", &arr+1);return 0;
}

运行结果

可以看到当对&arr[0],arr,&arr都+1时,&arr[0]和arr都移动了4个字节,而&arr移动了16个字节也就是整个数组的长度。

实际上除了&数组名表示整个数组的地址,在使用sizeof(数组名)计算数组的字节数时时,sizeof中的数组名表示的也是整个数组的地址。

总结:数组名表示的是数组首元素的地址,但有两个例外:

1.&数组名

这里的数组名实际上表示的是整个数组的地址

2.sizeof(数组名)

这里的数组名也表示整个数组的地址,计算的是整个数组的字节数。

 2.通过指针访问数组

#include <stdio.h>
int main()
{int arr[5] = { 0,1,2,3,4, };int i = 0;int n = 100;int* p = arr;for (i; i < 5; i++)//通过指针p给数组重新赋值{*p = n;n++;p ++;}for (i = 0; i < 5; i++)//打印数组每个元素{printf("%d ", arr[i]);}return 0;
}

运行结果:

可以看到数组的值可以通过指针被改变

把代码稍作修改:

#include <stdio.h>
int main()
{int arr[5] = { 0,1,2,3,4, };int i = 0;int n = 100;int* p = arr;for (i; i < 5; i++)//通过指针p给数组重新赋值{*p = n;n++;p++;}for (i = 0; i < 5; i++)//打印地址{printf("&arr[i] =%d\np+i     =%d\n", &arr[i],p+i);}return 0;
}

运行结果: 

 

 可以看到arr[i]的地址就是指针变量p+1的地址,这也是通过指针更改变数组的每一个元素的原因

3.数组和指针的不同点

int arr[10];
int * p = arr:
p = arr;
//ok

 当给p进行赋值时程序会正常执行

int arr[10];
int brr[10];
arr = brr;
//err

 当给函数名赋值时程序会报错

总结:赋值表达式的左操作数不能是数组名,但可以是指针变量。

 4.指针数组

指针数组就是存放指针的数组

例如:

#include <stdio.h>
int main()
{int a = 0;int* p = &a;int* pp = &a;int* ppp = &a;int arr[3] = { *p,*pp,*pp };printf("%d %d %d\n", arr[0], arr[1], arr[2]);return 0;
}

运行结果:

 

通过上面的代码可以看到通过指针数组的元素,也能访问到指针指向的变量。

 注意:指针数组是数组,而数组指针是指针

指针数组是存放指针的数组,数组指针是指向数组的指针。

http://www.lryc.cn/news/454696.html

相关文章:

  • Centos Stream 9备份与恢复、实体小主机安装PVE系统、PVE安装Centos Stream 9
  • Linux的发展历史与环境
  • Jax(Random、Numpy)常用函数
  • python-pptx 中 placeholder 和 shape 有什么区别?
  • 王者农药更新版
  • 各省份消费差距(城乡差距)数据(2005-2022年)
  • [Linux] 进程创建、退出和等待
  • 微软推出针对个人的 “AI伴侣” Copilot 会根据用户的行为模式、习惯自动进化
  • 【QT】QT入门
  • Linux 6.11版本发布
  • CSS 参考手册
  • 数据采集工具sqoop介绍
  • 扫盲:写给UI设计师的SCADA系统知识点
  • 类的特殊成员函数——三之法则、五之法则、零之法则
  • 计算机毕业设计 智慧物业服务系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • Python软体中使用SpaCy进行命名实体识别
  • 华为云技术深度解析:以系统性创新加速智能化升级
  • 推理攻击-Python案例
  • find_box_3d
  • Visual Studio2017编译GDAL3.0.2源码过程
  • 计算机网络——email
  • 【Linux】信号知识三把斧——信号的产生、保存和处理
  • 【国庆要来了】基于Leaflet的旅游路线WebGIS可视化实践
  • Element-UI Plus 暗黑主题切换及自定义主题色
  • 人工智能与机器学习原理精解【31】
  • 如何安全地大规模部署 GenAI 应用程序
  • verilog实现FIR滤波系数生成(阶数,FIR滤波器类型及窗函数可调)
  • OSPF的不规则区域
  • 大数据新视界 --大数据大厂之 Ibis:独特架构赋能大数据分析高级抽象层
  • 总结TypeScript相关知识