C和指针

一. 快速上手

1. 逻辑上删除一段程序:

#if 0

  statements

#endif

2. printf函数:%d十进制整型值、%o八进制、%x十六进制、%g浮点值、%c字符、%s字符串

 scanf函数:%d整型值、%ld长整型、%f浮点数、%lf双精度、%c字符、%s字符串

3. char *strchr(char* dest, char src) => 返回src字符在dest字符串中第一次出现的位置

 char *strstr(char* dest, char* src) => 返回src字符串在dest字符串中第一次出现的位置

 

二. 基本概念

1. cc -c test.c main.c将源文件test.c、main.c编译生成目标文件test.o和main.o;  cc test.o main.o链接几个目标文件

2. int ch; while((ch = getchar()) != EOF){ putchar(ch) };

 

三. 数据

1. 可以把字符串常量赋值给一个“指向字符的指针”,但是不能把字符串常量赋值给一个字符数组,因为字符串常量的直接值是一个指针,而不是这些字符本身。

2. char *message = "Hello World";(把message声明为一个指向字符的指针,并用字符串常量中的第一个字符的地址作为其值初始化)相当于char *message; message = "Hello World";

3. typedef出现在定义前面 char *ptr_to_char; typedef char *ptr_to_char; ptr_to_char a;将a声明为指向字符的指针

 

四. 语句

1. while( scanf("%f", &value) == 1 && value >= 0){}

2. switch(expression) {case constant-expression:} //expression的结果必须是整型值,constant-expression必须是常量表达式

3. switch(ch)

{

  case '\n': line += 1;

      /* FALL THRU */fall through表明ch贯穿所有case,当满足\n时除了执行line+=1,下面的words+=1和chars+=1都会执行

  case ' ':

  case '\b': words += 1;

      /* FALL THRU */

  default: chars +=1;

}

4. c不具备布尔类型,用整型表达式代替

5. c不具备任何I/O输入/输出语句,c也不具备任何异常处理语句,这些都是通过调用库函数实现的。

 

五. 操作符和表达式

1. 将指定位数置1:value |= (1 << bit_number);将指定位数置0:value &= (~(1 << bit_number));判断指定位数是否为0:value &= (1 << bit_value)

2. 逗号表达式的值为整个表达式最右边的值。if(b-10, c+4, d>0)//从左往右依次执行,但整个表达式的值为d>0

3. 下标引用:array[ 下标 ] 等价于 *(array + (下标))

4. lexp代表左值,左值代表一个位置,rexp代表右值,右值代表一个值,在左值的地方不能使用右值,在右值的地方可以使用左值

5. 大写转小写:#include <ctype.h> tolower(ch);

 

六. 指针

1. 硬件通过地址访问内存位置,编译器帮我们实现通过变量访问内存位置

2. 值的类型并非值本身所固有的特性,而取决于它的使用方式

3. 变量的值就是分配给该变量的内存位置所存储的值,即使是指针变量也不例外

4. 段违例:segmentation violation;内存错误:memory fault

5. 在特定数组中查找某个特定值得函数:返回状态值表示是否找到,如果找到,再返回指向该值得指针

6. 在对指针进行解引用操作/间接访问之前,必须确保指针不是NULL指针

7. *(int *)100 = 25;将整型强制转换为指向整型的指针,用于访问设备控制器接口

8. *p+1表示*p的值加1;*(p+1)表示p指向的地址加1后取值;p+1表示指针指向下一个地址

9. char ch;char *cp = &ch; *cp++//①++操作符产生cp的拷贝②++操作符再增加cp的值③最后在cp的拷贝上执行间接访问操作。

 当表达式*cp++作为左值时表示ch的内存位置,作为右值时表示ch的值

10. 当指针初始化为常量字符串时无法进行字符交换,只有当指针指向字符数组时才可以实现交换。

 

七. 函数

1. 字符串查找:if(strcmp(value, string) == 0)

2. 可变参数的函数:stdarg.h头文件;一个类型va_list;三个宏va_arg, va_start, va_end;

float average(int n_values, ...)

{

  va_list var_arg;

  int count;

  float sum;

  var_start(var_arg, n_values);//准备访问可变参数

  for(count = 0; count < n_values; count++)

  {

    sum += va_arg(var_arg, int);

  }

  va_end(var_arg);

  return sum/n_values;

}

3. 

2. 432 154

 

转载于:https://www.cnblogs.com/embeddedking/p/9752023.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值