今日代码:
输出随机的二维数组,并且按照每一个行中的最小值来对数组的行进行排序,列不可改变
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define N 5
int main()
{
int i,j;
int arr[N][N];
int min[N] = {0};
int tmp;
int k;
srand((unsigned)time(NULL));
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
arr[i][j] = rand() % 100;
printf("%4d",arr[i][j]);
}
printf("\n");
}
printf("***********\n");
for (i = 0; i < N; i++)
{
min[i] = arr[i][0];
for (j = 1; j < N; j++)
{
if (min[i] > arr[i][j])
{
min[i] = arr[i][j];
}
}
}
for (i = 0; i < N - 1; i++)
{
k = i;
for (j = i + 1; j < N; j++)
{
if (min[k] > min[j])
{
k = j;
}
}
if (k != i)
{
tmp = min[i];
min[i] = min[k];
min[k] = tmp;
for (j = 0; j < N; j++)
{
tmp = arr[i][j];
arr[i][j] = arr[k][j];
arr[k][j] = tmp;
}
}
}
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
printf("%4d",arr[i][j]);
}
printf("\n");
}
return 0;
}
定义一个函数,调用此函数的时候可以将输入的字符串中的第一个数字字符转换为数字
#include<stdio.h>
int main()
{
int i=0;
int num=0;
int flag=0;
char c[100];
printf("please enter a String+number!");
scanf("%s",c);
while (c[i]!='\0')
{
if ((c[i]<'0'||c[i]>'9'))
{
if (1==flag)
{
break;
}
}
else
{
if (0==flag)
{
flag=1;
}
num = num*10+(c[i]-'0');
}
i++;
}
printf("num =%d\n",num);
}
函数参数求值顺序从右往左:
第一行输出的结果是:2,1,0;因为i++是先引用后执行的,且printf可以看作一个函数,从右边开始输出,如果在执行一次输出则输出3
第二行的输出结果是55250,因为++i是先执行后调用的,所以在求值顺序从右开始的原则下,先执行i++,输出为0后i变成1.++i再让i加一,则i等于2,再i++,先调用i则输出2,再加一,i变为3.再执行两次++i让i变成了5再打印出来所有的++i则显示5
如下实例:
主函数三个参数 第一个参数 包括命令行在内有几个操作数和命令 输入的是命令如果包含数字则输出数字字符串
可变参数列表:
标准参数
char *ao字节型的指针 offset是大小
last 后面是可变参数
n以后的就是可变参数
递归函数:释放再返回结果,函数诶第嵌套调用,有流程转移
递归调用:自己调用自己
求阶乘的递归调用:优点在于代码小,简便
缺点:占有更多的时间和空间
注意:必须先判断条件是否满足,如果先执行可能没判断条件则无意义。
[下标运算符] -------a[ i ] []的作用从 a的地址开始偏移i个元素
a+i*l(l是单个的大小)
第一行相当于取的二维数组a[i][j].
指针函数和函数指针的区别:
指针函数是指带指针的函数,即本质是一个函数,函数返回类型是某一类型的指针。
类型标识符 *函数名(参数表)
int *f(x,y);
首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。
函数指针是指向函数的指针变量,即本质是一个指针变量。
int (*f) (int x); /*声明一个函数指针 */ f=func; /* 将func函数的首地址赋给指针f */
指向函数的指针包含了函数的地址的入口地址,可以通过它来调用函数。声明格式如下:
类型说明符 (*函数名) (参数)
其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明笔削和它指向函数的声明保持一致。
指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。
指针数组和数组指针的区别:
指针数组和数组指针的区别
a、指针数组:是指一个数组里面装着指针,也即指针数组是一个数组;
定义形式:int *a[10]
;
如图所示:
b、数组指针:是指一个指向数组的指针,它其实还是一个指针,只不过是指向数组而已;
定义形式:int (*p)[10]
;其中,由于[]的优先级高于*,所以必须添加(*p).
区分方法:
主要看后面的两个字是什么(前面是修饰作用),因此指针数组是数组,而数组指针是指针。
函数定义的注意点:
int n;
scanf("%d",&n);
int a[n];
该声明数组的方法是错误的,因为你在Linux c的环境下,是先编译运行在输入的,输入n 的时候int a[n]已经执行过了,所以无法确定。
数组的特性:连续,有序,同质,对数组的操作就是对其元素的操作