欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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++;
        }
    }
}