指针进阶(三)再谈数组与串函数

🌞欢迎来到C语言的世界 
🌈博客主页:卿云阁

💌欢迎关注🎉点赞👍收藏⭐️留言📝

🌟本文由卿云阁原创!

🌠本阶段属于练气阶段,希望各位仙友顺利完成突破

📆首发时间:🌹2023年1月4日🌹

✉️希望可以和大家一起完成进阶之路!

🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!


🍈 数组的实质

      表达式a[b]等价于表达式*((a)+(b)),并且由于加法交换律,所以它也等价于b[a]。在表达式a和b中,表达式结果必须一个是指针,另一个是整型数据。指针可以是数组名的值、指针变量、用&获取的地址或者是由它们构成的表达式,通过指针指向的数据类型和整数就可以确定表达式a[b]的值所在的地址,因而就可以确定a[b]的值。

例:有一维数组int a[10]={1,2,3,4,5,},x=2 ,p=a;,指出下列表达式的值:(x*x)[a]、(a+2)[2]、(p+4)[0]、p[4]、4[p]的值。

(x*x)[a]: 2*2的值是4,所以下标是4,a是地址,表达式的值是5。

(a+2)[2]:a+2代表地址,下标是2,表达式的值是5。

(p+4)[0]:p+4代表地址,下标是0,表达式的值是5。

p[4]:p代表地址,下标是4,表达式的值是5。

4[p]:p代表地址,下标是4,表达式的值是5。

 对于二维数组a,表达式a[b]同样有效(b为整数),即它的值也为*((a)+(b))。此时,因为a指向的数据类型是一维数组,则a[b]就是从地址a开始向后的第b行那个一维数组,所以此时a[b]的值是一个指针值,它指向这个一维数组的第0个元素。所以在a[b][c]这种形式中(c为整数),a[b]是一个指针,它指向的类型是一维数组元素的类型,因此a[b][c]也是一个“指针[整数]”的形式,根据加法交换律,它也可以写成“c[a[b]]”的形式。

例如,有int a[2][3]={1,2,3,4,5,6}; 则a[0][2]、2[a[0]]、(*a)[2]、2[*a]、*(*a+2)、*(2+*a)、2[a[0]]都是同一个变量,其值都为3。

因此,在如形a[b]这样的形式中,地址不一定只能用数组名,可以直接是一个指针值,如"abc"[1]也是符合语法的,其值为'b'。如果有一个指向一维数组的指针变量arr,也可以写成arr[b][c]的形式,其结果与*(*(arr+b)+c)是一样的。因此,在一个定义的函数中,如果一个指向一维数组的指针变量形参arr接收到一个二维数组名a的值时,只要它们指向的一维数组类型一致,则arr[i][j]就是a[i][j]。 

例.把一个二维数组中第0行和第1行看成两个向量,写一个函数,计算这两个向量的点积并返回它们的值。两个向量a = [a1, a2,…, an]和b = [b1, b2,…, bn]的点积定义为:a·b=a1b1+a2b2+……+anbn。

#include <stdio.h>
float dot_product(int col,float (*x)[col])//col为列数。
{
    float sum=0;
    int i; 
    for(i=0;i<col;i++)
        sum+=x[0][i]*x[1][i];  //注意这里的写法。 
    return sum;
}
int main(void)
{
	float a[2][3]={1,2,3,4,5,6};
	printf("%f\n",dot_product(3,a));
	return 0;
}

 🍉串函数

输出字符串的函数:int puts(const char *string)

接收字符串的函数:char* gets(char*buffer);

字符串复制函数:char *strncpy(char *dest, char *src,size_t  n);

这些函数中的指针类型形参,实质上需要接收的只是指针值,操作时,都是以地址为标准的,例如调用puts输出一个字符串str,写成puts(str),它执行的过程实质上是根据str里的地址值进行的,即从这个地址值开始输出字符,直到遇到'\0'为止。掌握了这个实质,就可以进一步去灵活运用它。

例如,有char str[]="A student";,要直接输出后一个单词,用puts函数只要写成:puts(str+2);,因为str+2作为一个指针,指向字符's'。

再例如,对于char str1[10]="A student",str2[]="teacher";,要把student换成teacher,只要写成:strcpy(str1+2,str2)。

在一个二维字符数组str[M][N]中,可以用printf("%s",str[i])输出第i行的串,也可以用printf("%s",str[i]+k);从第i行的k个字符开始输出字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卿云阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值