C基础

有些概念的、重要的东西时间过久了容易忘记,好记性不如烂笔头,记录下来以便查阅

  • 标准输入输出库,是函数的申明,在编译链接的时候会去找到相关函数的实现(通常是在编译器的libs中。)

  • system("puase")(和getChar()一个效果);这句话其实是执行的系统命令,假如命令为:mspaint则打开的是画板(在windows中)

  • 占位符:
    int : %d
    short: %d
    long :%ld
    float :%f
    double :%lf
    string :%s
    十六进制:%x
    八进制:%o

  • scanf("");

  • define xxxx------>宏定义

void main() {
    int i=0;
    int* p = &i;
    printf("%#x\n",p);
    printf("%#x\n",&p);
    printf("%d\n",*p);
}

代码解读:
1、int* p申明一个int类型的(指针也是需要有类型的)指针类型的变量p,&为取地址符,表示存放i变量值的内存地址,而p变量的值存放为这个地址,
输出为:
0x5fbff75c ——>p的值,也就是i的地址
0x5fbff750 ——> 对指针变量p取地址,存放变量p的地址
0 ——>对*p取值,因为是p是指针变量,所以取到的是以p的值的内存地址编号存放的值

C基础_第1张图片
image.png
  • 形参和实参
void change(int p) {
    p=100;
}

/**
 * 相对于java中的值传递和应用传递
 */
void main() {
    int i=90;
    int* p = &i;
    change(i);
    printf("%d\n",i);
}

这样子的输出是:90。因为把实参的值赋值给形参p,由于p是另外开辟的空间,改变p的值对i毫无影响。
如果想要i的值也要改变,就需要用到指针变量

void change(int *p) {
    *p=100;
}

/**
 * 相对于java中的值传递和应用传递
 */
void main() {
    int i=90;
    int* p = &i;
    change(p);
    printf("%d\n",i);
}

  • 指针的类型
    指针也是有类型的
/**
 * 指针的类型
 */
void main() {
    int i=90;
    int* p = &i;
    double j = 89.2;
    p = &j;
    printf("%d\n",sizeof(int));
    printf("%d\n",sizeof(double));
    printf("%lf\n",*p);
}
输出:
4
8
0.000000

当一个double类型变量的地址赋值给int类型的指针的时候,取值会不正确的。因为指针p是int类型,占4个字节,存放的是内存当中开始的地址,也就是开始的地址往后数四个字节。当double类型的数据赋值给int指针p的时候,double是八个字节,当取值的时候p是int类型的指针只会去四个字节的值,所以取到的值只是高四位的值。
所以:指针保存的是地址开始的位置。

  • 指针的运算
/**
 * 指针的运算
 */
void main() {
    int ids[] = {1,3,4,5,6,7};
    printf("%#x\n",ids);
    printf("%#x\n",&ids[0]);
}
输出:
0x5fbff6e0
0x5fbff6e0
0x5fbff6e0

可以看到,数组变量名的值,就是数组第一个元素的地址,&ids也是,编译器做了处理。
所以可以将数组变量名的值赋值给一个指针变量(*p)

你可能感兴趣的:(C基础)