编程基础知识

    • 1. 优先级及”++”
    • 2. bool 类型与float 类型使用if判断“零值”
    • 3.数据类型的转换
    • 4.预处理指令
    • 5.头文件
    • 6. .h文件标准开头
    • 7.内存分配
    • 8.static作用
    • 9.数组与指针
    • 10.二维数组

1. 优先级及”++”

执行代码:
int a = 1;
int b = 0;
int c = 0;
int d = (++a) * (c = 1);
则a,b,c,d的值分别是多少?
2,0,1,2

2. bool 类型与float 类型使用if判断“零值”

bool flag;
    if(flag) 或 if(!flag)
float x = 0.001;
    if(x <= 0.001)

3.数据类型的转换

void foo(void)
{
    unsigned int a = 6;
    int b = -20;
    (a+b>6) ? puts(">6") : puts("<=6"); 
}
输出:
    >6

有符号数与无符号数转换规则, 将转换为无符号类型。
-20 的机器数为FFFF FFECH
则a+b大于 6

所以尽量使用无符号数,来保证数据类型的统一。

4.预处理指令

C语言的编译预处理指令均以“ # ”开头。例如:#pragma,#define。
sizeof 为运算符,malloc 为函数。

5.头文件

#include #include "filename.h" 的区别?
1.使用宏指令#include 是通知编译器在预处理时要包含开发环境中提供的名为filename.h 的头文件。
2.使用宏指令#include "filename.h"是要求编译器在预处理时优先包含编译者指定路径下的名为filename.h的头文件,如果在指定路径下没有发现名为filename.h的头文件,则使用系统提供的头文件。

6. .h文件标准开头

#ifndef DIALOG_H    // 判断如果没有宏定义DIALOG_H,则执行;如果已经定义DIALOG_H则不执行。
#define DIALOG_H    // 宏定义 DIALOG_H
...代码段
#endif // DIALOG_H  //  结束

作用是防止该头文件被重复引用。

7.内存分配

栈:由编译器进行管理,自动分配和释放。
堆:用于程序动态申请分配和释放空间。
全局(静态)存储区:分为DATA段和BSS段。DATA段存放初始化的全局变量和静态变量;BSS段存放未初始化的全局变量和静态变量。
程序代码段:存放程序的二进制代码。

8.static作用

  1. 在一个函数中说明一个静态变量。
  2. 在一个模块内说明一个静态变量,可以被模块内所有函数访问,但不能被模块外其他函数访问。
  3. 在一个模块内说明一个静态的函数,静态函数只能被同一模块内的其他函数嵌套调用,使函数本地化。

9.数组与指针

具有相同类型的指针类型变量p与数组a,不能进行的操作是(D)
A. p = a; B. *p = a[0]; C. p = &a[0]; D. p =&a;
选项D:&a 的含义是取数组指针(即得到的地址的数据类型是指向数组的指针),与指针变量p的类型不匹配。可修改为 p = (int *)&a;

#include 

int main()
{
    int a[4] = {1, 2, 3, 4};
    int *ptr = (int *)(&a + 1);
    printf("%d\r\n",(*ptr - 1));

    return 0;
}
输出:4

解析:在函数中,a为int类型数组,数组名a也代表数组a的起始地址。&a的含义是指向数组a的指针( 即int()[4] ),表达式(&a+1)的含义是指向下一个有4个int元素的整型数组,即(&a+1)在数值上等于数组元素a[3]的“下一个地址”。为指针ptr赋值的表达式是(int )(&a+1),其含义是将地址强制转换为指向int的指针,即指针ptr指向a[3]之后的“下一个元素”。

int (*a)[10];   //定义的是一个数组指针,指向一个有10int类型元素的整型数组。
int *a[10];     // 定义的是一个指针数组,每个元素为指向int型的指针。

设有int w[3][4];pw是与数组名w等价的数组指针,则pw的初始化语句为(int (*pw)[4] = w);
给地址0xaae0275c赋值为1?

1.volatile int *p = (int *)0xaae0275c;  *p = 1;
2.volatile int *p = (int *)0xaae0275c;  p[0] = 1;
3.*(volatile int *)0xaae0275c = 1;

10.二维数组

数组定义为 int a[4][5];引用*(a+1)+2表示a数组第1行第2列元素的地址。
由于a是二维数组, a:数组名,代表数组的起始地址(常量)
a+1:类型也为 int (*)[5],指向a[1]
*(a+1):类型为int *,指向一维数组中下标为 1的行。

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