🌞欢迎来到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个字符开始输出字符串。