c和指针(pointers on C)第八章学习记录
程序员文章站
2022-03-11 18:25:13
...
1.自动计算数组长度
一个有趣的数组初始化使用技巧
int vector[ ]={1,2,3,4}
当数组内的数据可能经常被修改时,编译器会自动计算数组长度。
2.字符数组的初始化
下面两种初始化形式
char message[]="hello"
char *message="hello"
第一种初始化方式只是单纯的初始化一个字符数组,
而第二种才表示一个字符串常量,且指针指向字符串储存位置。
第八章有一个很有意思的编程题。
两个矩阵相乘,函数原型为
void matrix(int *m1,int *m2,int *r,int x,int y,int z);
我按照正常的方法写了下
#include<stdio.h>
#define X 3
#define Y 2
#define Z 4
void matrix_mutipy(int m1[][Y],int m2[][Z],int r[][Z],int x,int y,int z){
int i,j,k;
for(i=0;i<x;i++){
for (j=0;j<z;j++){
for(k=0;k<y;k++){
r[i][j]+=m1[i][k]*m2[k][j];
}
}
}
}
int main(){
int m1[X][Y]={
{2,-6},
{3,5},
{1,-1}
};
int m2[Y][Z]={
{4,-2,-4,-5},
{-7,-3,6,7}
};
int r[X][Z]={0};
int i,j;
matrix_mutipy(m1,m2,r,X,Y,Z);
for(i=0;i<X;i++){
for (j=0;j<Z;j++)
printf("%d ",r[i][j]);
printf("\n");
}
return 0;
}
很明显,这并没有用到函数原型里面的参数方法。我一直在想传递数组时,为什么用的是int *, 在参考答中,m1,m2为二元数组的地址,而二元数组的实际储存形式是顺序排列的,因此可以通过改变地址的位置,来找到我们需要的变量,下面为参考答案
void matrix_multiply( int *m1, int *m2, int *r,
int x, int y, int z )
{
register int *m1p;
register int *m2p;
register int k;
int row;
int column;
/*
* 外层的两个循环逐个产生结果矩阵的元素。由于这是按照存在顺序
* 进行的。我们可以通过对r进行间接访问来访问这些元素。
*/
for( row=0; row<x; row+=1 )
{
for( column=0; column<z; column+=1 )
{
/*
* 计算结果的一个值。这是通过或得指向m1和m2的合适元素的指针,
* 当我们进行进行循环时,使他们前进来实现的。
*/
m1p = m1 + row * y; // row*y 即表示将纵列中找到元素
m2p = m2 + column; // 同理
*r = 0;
for( k=0; k<y; k+=1 ) //循环得到*r的值
{
*r += *m1p * *m2p; //r数组元素的值
m1p += 1; //m1数组的行
m2p += z; //m2数组的列
}
/* r 前进一步,指向下一个元素 */
r++;
}
}
}
上一篇: Java入门你需要会什么?