指针和数组的千丝万缕(一)

本文通过一个具体的C语言程序示例,详细解释了指针与数组的关系,特别是如何通过指针操作二维数组中的元素,并展示了如何在函数间传递数组以及修改其值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>

void foo(int[][3]);

int main(void)
{
   int a[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };

   foo(a);
   printf("%d\n", a[2][1]);

   return 0;
}

void foo(int b[][3])
{
   ++b;
   b[1][1] = 9;
}

gdb之后:

++b的步长实际上是3个int,也就是++b运算以后,b指向{4,5,6}这个数组的开始,而b[1]就是{7,8,9}, b[1][1]实际上就是8这个值也就是main函数中的a[2][1].

In foo, b has type pointer to array[3] ofint, and after the increment, itpoints to the array a[1] ({4, 5, 6}).  So b[1] has type array[3] of int, and it denotes the arraya[2] ({7, 8, 9}).  In value context,b[1] “decays” into a pointer toa[2][0] (7), so b[1][1] denotesa[2][1], whose value is changed from 8 to 9.


3关:字符串比较 100 学习内容 参考答案 记录 评论 任务描述 相关知识 指向数组元素的指针 引用数组元素时指针的运算 引用数组元素 字符指针作函数参数 编程要求 测试说明 任务描述 本关任务:编写个函数,实现两个字符串的比较。 相关知识 指针数组虽然是不同的东西,但有着千丝万缕的联系。本关我们就来学习数组有关的指针。 指向数组元素的指针 指针变量既可以指向变量,也可以指向数组元素(即把某个元素的地址放到指针变量中)。 例如: int a[5] = {1,3,5,7,9}; int *p; p = &a[0]; 以上是使指针变量 p 指向 a 数组的第0个元素。 引用数组元素时指针的运算 当指针指向数组元素时,可以对指针进行加减运算。 如上例子 p 指向数组元素 a[0] , p+1 则表示指向下数组元素 a[1] 。 在指针指向数组元素时,可以对指针进行以下运算: 加个整数,如p+1个整数,如p-1 自加运算,如p++,++p 自减运算,如p--,--p 两个指针相减,如p1-p2(只有当 p1 p2 都指向同数组中的元素才有意义) 注意:如果指针变量 p 指向数组中的个元素,则 p+1 指向同数组中的下个元素, p-1 指向同数组中的上个元素。 引用数组元素 引用数组元素,可以有两种方法: 下标法:如 a[i] 的形式。 指针法:如*(a+i)或*(p+i),其中 a 是数组名, p 是指向数组元素的指针变量,其初值为 p = a 。 说明:因为 p+i 是指向 p 所指元素后第 i 个元素的指针,所以在其前加上指针运算符后得到的*(p+i)就是该元素的别名。因此,如果 p 指向 a[0],那么表达式*(p+i)就表示 a[i] 本身。 字符指针作函数参数 如果想把个字符串从个函数“传递”到另个函数,可以用地址传递的办法,即用字符数组名作为参数。 也可以用字符指针变量作为参数,在被调用的函数中可以改变字符串的内容,在主调函数(现在有 A、B 两个函数,A 函数调用了 B 函数,那么,A 函数就是主调函数,B 函数就是被调函数)中可以引用改变后的字符串。 编程要求 在右侧编辑器中的Begin-End之间补充代码,以实现字符串比较的功能。具体要求如下: 函数原型为:int stringCompared(char * p1,char * p2);,设p1指向字符串 s1,p2指向字符串 s2 ; 当 s1 == s2 时,返回值为0; 当 s1 != s2 时,返回他们两者第个不同的字符的 ASCII 码差值。即如果 s1 > s2 ,则输出个正值,如果 s1 < s2 ,则输出个负值。 测试说明 平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试: 测试输入:asd123 asd123 预期输出:0 测试输入:123456 12356789 预期输出:-1#include <stdio.h> /********** Begin **********/ //在此编写函数,实现字符串比较 /********** End **********/ … printf("%d",m); return 0; }
最新发布
06-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值