C基础

1. 问题:pow(a,2)会报错:undefined reference to `pow'
原因:像 pow(2,3); 这种调用,gcc 在编译时就可以将其替换为对应的值(gcc 优化的一部分),从而不需要链接 pow 所在的数学库 libm;
而像 pow(a,2); 这种调用,一般无法做这种替换,因此需要链接 libm。
解决:加选项-lm
其他:
-lm:寻找libm.o这个库的某个函数的所有函数
函数库是由库函数构成,函数有时候要多个库支持
math并不是一个库而是函数,函数有时候要多个库支持,所以要用-lm的方法把所有库整合一起才能调用这个函数


2. printf()

1) 多进制转换
%d:十进制
%o:八进制
%x:十六进制
注:无二进制的表示方法

2) 占位宽、左右对齐
printf("%10d",a);    //占10位,且右对齐
printf("%-10d",a);    //占10位,且左对齐

3) 小数位数控制
a=3.14;    //3.140000
printf("%.2f",a);    //3.14
printf("%5.2f",a);    //||3.14
注:占位小于实际位数:
printf("%3.2f",a);    //3.14

4) *号 - 代表任何整数
a=3.14,b=5,c=2;
printf("%.*f
",c,a);    //3.14 , * = c
printf("%*.*f
",b,c,a);


3. 输入不定个数的一组数
1) malloc()
void* malloc(unsigned size);
在内存的动态存储区中分配一块长度为size字节的连续区域,参数size为需要内存空间的长度,
返回该区域的首地址.

2) realloc()
void* realloc(void* ptr, unsigned newsize);
给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度.

例:
#include <stdio.h>
void main()
{
    int a,i=0,j;
    int *stack=(int *)malloc(1*sizeof(int));
    while(scanf("%d",&a)!=EOF){
        stack[i++]=a;
        stack=(int *)realloc(stack,sizeof(int));
    }   
    for(j=0;j<i;j++){
        printf("%d ",stack[j]);
    }   
}
原文地址:https://www.cnblogs.com/stellar/p/8710289.html