#include<stdio.h>
#include<stdlib.h>
#define SIZE 4
#define SIZES 10
#define ROWS 3
#define COLS 4
int sum(int ar[],int n);
int sump(int*start,int *end);
void show_array(const double ar[],int n);
void mult_array(double ar[],int n,double mult);
void sum_rows(int ar[][COLS],int rows);
void sum_cols(int [][COLS],int);
int sum2d(int(*ar)[COLS],int rows);
int main()
{
/* day_mon2.c---让编译器计算元素的个数*/
/* const int days[]={31,28,31,30,31,30,31,31,30,31};
int index;
for(index=0;index<sizeof days/ sizeof days[0];index++)
printf("Month %2d has %d days.\n",index+1,days[index]);*/
//pnt_add.c---指针地址
/* short dates[SIZE];
short *pti;
short index;
double bills[SIZE];
double *ptf;
pti =dates;
ptf =bills;
printf("%23s %15s\n","short","double");
for(index=0;index<SIZE;index++)
printf("pointers+%d: %10p %10p\n",index,pti+index,ptf+index);*/
//sum_arr1.c---数组元素之和
/*int marbles[SIZES]={20,10,5,39,4,16,19,26,31,20};
long answer;
answer=sum(marbles,SIZES);
printf("The total number of marbles is %ld.\n",answer); //【int*SIZES=40,所以该数组就是40个字节】
printf("The size of marbles is %lu bytes.\n",sizeof marbles);
/*sum_arr2.c---数组元素的和*/
/*int marbles[SIZES]={20,10,5,39,4,16,19,26,31,20,};
long answer;
answer=sump(marbles,marbles+SIZES);
printf("The total number of marbles is %ld.\n",answer); /*我的编译器不支持这种写法*/
/*order.c---指针运算中的优先级*/
/* int data[2]={100,200};
int moredata[2]={300,400};
int *p1,*p2,*p3;
p1=p2=data;
p3=moredata;
printf("*p1=%d, *p2=%d, *p3=%d\n",*p1,*p2,*p3);
printf("*p1++=%d, *++p2=%d, (*p3)++=%d\n",*p1++,*++p2,(*p3)++);
printf("*p1=%d, *p2=%d, *p3=%d\n",*p1,*p2,*p3);//「相当于*p1先输出值再把地址加1,*p2把地址加1再输出值,*p3是先输出值,再把值加1』
/*指针的八种操作*/
/* int urn[5]={100,200,300,400,500};
int *ptr1,*ptr2,*ptr3;
ptr1=urn; //把一个地址赋给指针
ptr2=&urn[2]; //把一个地址赋给指针
//解引用指针,以及获得指针的地址
printf("pointer value, dereferenced pointer, pointer address:\n");
printf("ptr1=%#p , *ptr1=%#d , &ptr1=%#p\n",ptr1,*ptr1,&ptr1);//「指针ptr1指向的是数组的首地址,但数&ptr指向的是指针本身的地址,说明指针本身是有地址」
//指针加法
ptr3=ptr1+4;
printf("\nadding an int to a pointer:\n");
printf("ptr1+4=%#p, *(ptr1+4)=%d\n",ptr1+4,*(ptr1+4));
ptr1++; //递增指针
printf("\nvalues after ptr1++:\n");
printf("ptr1=%#p, *ptr1=%d, &ptr1=%#p",ptr1,*ptr1,&ptr1);
ptr2--; //递减指针
printf("\nvalues after --ptr2:\n");
printf("ptr2=%#p,*ptr2=%d,&ptr2=%#p\n",ptr2,*ptr2,&ptr2);
--ptr1; //恢复初始值
++ptr2; //恢复初始值
printf("\n Pointers reset to original values:\n");
printf("ptr1=%#p,ptr2=%#p\n",ptr1,ptr2);
//一个指针减去另一个指针
printf("\nsubtracting one pointer from another\n");
printf("ptr2=%#p, ptr1=%#p , ptr2-ptr1=%td\n",ptr2,ptr1,ptr2-ptr1);
//一个指针减去一个整数
printf("\nsubtracting an int from a pointer:\n");
printf("ptr3=%#p,ptr3-2=%#p\n",ptr3,ptr3-2);*/
//arf.c---处理数组的函数*/
/* double dip[SIZE]={20.0,17.66,8.2,15.3};
printf("The original dip array:\n");
show_array(dip,SIZE);
mult_array(dip,SIZE,2.5);
printf("The dip array after calling mult_array():\n");
show_array(dip,SIZE); */
/*本章最难!!!!! zippol.c----zippo的相关信息*/
/* {
int zippo[4][2]={{2,4},{6,8},{1,3},{5,7}};
printf("zippo=%#p,zippo+1=%#p\n",zippo,zippo+1);
printf("zippo[0]=%#p,zippo[0]+1=%#p\n",zippo[0],zippo[0]+1);
printf("*zippo=%#p,*zippo+1=%#p\n",*zippo,*zippo+1);
printf("zippo[0][0]=%d\n",zippo[0][0]);
printf("*zippo[0]=%d\n",*zippo[0]);
printf("**zippo=%d\n",**zippo);
printf("zippo[2][1]=%d\n",zippo[2][1]);
printf("*(*(zippo+2)+1)=%d\n",*(*(zippo+2)+1));
} */
/*array2d.c---处理二维数组的函数!!!!就算行列的各自的sum*/
/* int junk[ROWS][COLS]={{2,4,6,8},{3,5,7,9},{12,10,8,6}};
sum_rows(junk,ROWS);
sum_cols(junk,ROWS);
printf("SUM of all elements=%d\n",sum2d(junk,ROWS));*/
}
int sum(int ar[],int n) //【函数中数组的字节大小?8 因为ar虽然写作数组但其实本身是char类型的指针,所以为8个字节】
{
int i;
int total =0;
for(i=0;i<n;i++)
total+=ar[i];
printf("The size of ar is %lu bytes.\n",sizeof ar);
}
/*使用指针算法*/
int sump(int *start,int *end)
{
int total=0;
while(start<end)
{
total+=*start;
start++;
}
}
/*显示数组的内容*/
void show_array(const double ar[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%8.3f",ar[i]);
putchar('\n');
}
/*把数组的每个元素乘以相同的值*/
void mult_array(double ar[],int n,double mult)
{
int i;
for(i=0;i<n;i++)
ar[i]*=mult;
}
void sum_rows(int ar[][COLS],int rows)
{
int r; int c; int tot;
for(r=0;r<rows;r++)
{
tot=0;
for(c=0;c<COLS;c++)
tot+=ar[r][c];
printf("row %d:sum=%d\n",r,tot);
}
}
void sum_cols(int ar[][COLS],int rows)
{
int r; int c; int tot;
for(c=0;c<COLS;c++)
{
tot=0;
for(r=0;r<rows;r++)
tot+=ar[r][c];
printf("col %d:sum=%d\n",c,tot);
}
}
int sum2d(int ar[][COLS],int rows)
{
int r; int c; int tot=0;
for(r=0;r<rows;r++)
for(c=0;c<COLS;c++)
tot+=ar[r][c];
return tot;
}