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

【C语言】(8)—指针2

文章目录

  • 一、指针基础回顾
    • 1.1 指针声明与初始化
    • 1.2 指针的解引用
  • 二、数组名的本质
    • 2.1 数组名即首元素地址
    • 2.2 两个例外情况
  • 三、使用指针访问数组
    • 3.1 指针算术运算访问数组
    • 3.2 数组下标与指针的等价性
  • 四、一维数组传参的本质
  • 五、冒泡排序算法实现
  • 六、二级指针
  • 七、指针数组

一、指针基础回顾

指针本质上是一个变量,其存储的是内存地址。通过指针,我们可以直接访问和操作内存中的数据,这赋予了C语言极高的灵活性和效率。

1.1 指针声明与初始化

int a = 10;       // 定义一个整型变量
int *p = &a;      // 定义一个指向整型的指针,并初始化为a的地址

这里p是一个指针变量,它存储的是变量a的内存地址。&是取地址运算符,用于获取变量的内存地址。

1.2 指针的解引用

printf("%d\n", *p);  // 输出10,*p表示访问p指向的值
*p = 20;             // 通过指针修改a的值
printf("%d\n", a);   // 输出20

二、数组名的本质

数组名在大多数情况下代表数组首元素的地址,但有两个重要的例外情况。

2.1 数组名即首元素地址

int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("&arr[0] = %p\n", &arr[0]);
printf("arr = %p\n", arr);

输出结果将显示&arr[0]和arr的值相同,证明数组名确实是首元素地址。

2.2 两个例外情况

sizeof(数组名):此时数组名表示整个数组,计算的是整个数组的大小

printf("%d\n", sizeof(arr));  // 输出40(假设int为4字节,10个元素)

&数组名:此时取到的是整个数组的地址

printf("&arr = %p\n", &arr);
printf("&arr+1 = %p\n", &arr+1);  // 会跳过整个数组(40字节)

三、使用指针访问数组

3.1 指针算术运算访问数组

int arr[10] = {0};
int *p = arr;
for(int i=0; i<10; i++) {scanf("%d", p+i);  // 等价于&arr[i]
}
for(int i=0; i<10; i++) {printf("%d ", *(p+i));  // 等价于arr[i]
}

3.2 数组下标与指针的等价性

arr[i]和*(arr+i)是完全等价的,编译器会将前者转换为后者:

arr[3] = 10;    // 等价于
*(arr+3) = 10;  // 同样效果

四、一维数组传参的本质

数组作为函数参数传递时,实际上传递的是数组首元素的地址,而非整个数组。

void test(int arr[]) {printf("%d\n", sizeof(arr));  // 输出指针大小(4或8字节)
}int main() {int arr[10] = {0};printf("%d\n", sizeof(arr));  // 输出40(整个数组大小)test(arr);return 0;
}

五、冒泡排序算法实现

void bubble_sort(int arr[], int sz) {for(int i=0; i<sz-1; i++) {for(int j=0; j<sz-i-1; j++) {if(arr[j] > arr[j+1]) {int tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;}}}
}

六、二级指针

int a = 10;
int *pa = &a;     // 一级指针
int **ppa = &pa;  // 二级指针

七、指针数组

int arr1[] = {1,2,3,4,5};
int arr2[] = {2,3,4,5,6};
int arr3[] = {3,4,5,6,7};
int *parr[3] = {arr1, arr2, arr3};for(int i=0; i<3; i++) {for(int j=0; j<5; j++) {printf("%d ", parr[i][j]);  // 模拟二维数组访问}printf("\n");
}

相关文章:

  • 65.Three.js案例-使用 MeshNormalMaterial 和 MeshDepthMaterial 创建 3D 图形
  • Screeps Arena基础入门
  • 基于STM32、HAL库的CP2104 USB转UART收发器 驱动程序设计
  • 最新Spring Security实战教程(十四)OAuth2.0精讲 - 四种授权模式与资源服务器搭建
  • 湖南省密码协会成立,麒麟信安担任副会长单位共话密码创新应用之道
  • 【Python Web开发】05-WSGI概述
  • WordPress插件:WPJAM Basic优化设置
  • 数据库(MySQL)基础
  • 【AI提示词】费曼学习法导师
  • 【时时三省】(C语言基础)怎样定义和引用二维数组
  • 开平机:卷材高效成板的核心装备
  • 无需标记点,精准面部捕捉!无线面捕头盔赋予自由表演空间
  • Java大师成长计划之第15天:Java线程基础
  • 3.5/Q1,GBD数据库最新文章解读
  • ubuntu24.04安装anaconda
  • Spring Boot + Vue 实现在线视频教育平台
  • Spring Boot 3 + Undertow 服务器优化配置
  • modbus 帧信息格式
  • Linux/AndroidOS中进程间的通信线程间的同步 - 消息队列
  • [数据库之十一] 数据库索引之联合索引
  • 马克思主义理论研究教学名师系列访谈|董雅华:让学生感知马克思主义理论存在于社会生活中
  • “三德子”赵亮直播间卖“德子土鸡”,外包装商标实为“德子土”
  • 北京:下调个人住房公积金贷款利率
  • 戴维·珀杜宣誓就任美国驻华大使
  • 李云泽:小微企业融资协调工作机制已发放贷款12.6万亿元
  • 中俄合拍电影《红丝绸》将于今年9月在中国上映