C和指针笔记

来源:互联网 发布:mac cf 编辑:程序博客网 时间:2024/05/17 01:45

本人水平有限,欢迎大家纠错呦~

#include...

#define...

称为预处理指令,预处理器读入源代码,根据预处理指令对其进行修改,然后把修改过的源代码递交给编译器

预处理器用名为stdio.h的库函数头文件内容替换为替换#include指令,结果stdio.h的内容被逐字写到源文件的那个位置

如果有一些声明需要用于几个不同的源文件,你可以在一个单独的文件中编写这些声明,然后用#include把这个文件包含到需要使用这些声明的源文件中

int read(int c[],int m);形参分别是整形数组和整形标量,函数原型中参数的名字并非必须。

c语言中数组参数是以引用形式进行传递的,在函数中对标量参数的任何修改都会在函数返回时消失,当被调用函数修改数组参数的其中一个元素时,调用函数所传递的数组就会被实际的修改

“hello”在内存中占用6个字节

int read(int c[],int m){

}

这种方法不利之处就是函数没法知道该数组的长度,如果确实需要知道,它的值必须作为一个单独的参数传递给函数

包括Java,形参和实际参数的名字并没有关系

int ch;

while((ch=getchar())!=EOF&&ch!=’\n’)可以减少代码冗余语句

整形能够容纳下char,EOF就是一个整形

当数组名作为实参时,传给函数的实际上是一个指向数组起始位置的指针

whileif表达式中蕴含赋值操作

始终要检查,确保数组不越界

学习一门编程语言的基础知识不如编写程序有趣,但是,不知道语言基础知识会使你在编写程序时缺少乐趣

注释可以出现在任何空格可以出现的地方

经过初始化的静态变量在程序执行前能获得他们的值

C语言中,仅有整形,浮点型,指针和数组,结构体 基本数据类型

浮点数在缺省情况下都是double类型

变量的值存储在计算机的内存中

如果你需要修改字符串,请把它存储于数组中

当一个字符串常量出现在一个表达式中时,表达式所使用的值就是这些字符所存储的地址,而不是这些字符本身,所以不能把字符串常量赋给一个字符数组,除非你需要使用C++里的运算符重载(C++C的超集,对Java,安卓开发至关重要)

我们可以把字符串常量赋给一个指向字符的指针,字符串常量中第1个字符的地址对该指针初始化

C里面strcpy可以对字符串进行赋值

使用typedef比使用define更高效

typedef d char *

d a,b;

ab全都是指向字符型的指针

int const *p;

你可以修改指针的值,但你不能修改它所指向的值

int *const p;

无法修改指针的值,你可以修改它所指向的值

int const *const p;

什么都不能修改

名字常量非常有用

当代码块处于嵌套状态时,声明于内层代码块的标识符的作用域到达该代码块的尾部便终止,如果内层代码块有一个标识符的名字与外层代码块的一个标识符同名,外层的那个标识符无法在内层代码块中通过名字访问,尽量避免在嵌套的代码块中出现相同的变量名

static int b; b就将为这个源文件所私有

存储类型是指存储变量值的内存类型,有三个地方可用于存储变量:内存,运行时堆栈,硬件寄存器

变量的缺省值存储类型取决于它的声明位置,凡是在任何代码块之外声明的变量总是存储于静态内存中,这类变量称为静态变量,程序运行前创建,程序执行周期始终存在,始终保持原先的值,除非程序结束或给它赋一个不同的值,函数的形式参数部分不能声明为static,否则不支持递归

static详解:

static用于函数定义时,或用于代码块之外的变量声明时,它用于修改标识符的链接属性,从external改为internal,但标识符的存储类型和作用域不受影响,这些函数或变量只能在声明他们的源文件中访问,代码块内部声明时参考上一自然段

变量声明为static表示他们不存储在堆栈中,P46认真再看一下

只要变量并非声明于代码块或函数定义内部,它就是全局变量,否则的同时,在它前面加上extern将它所引用的是全局变量

代码块就是位于一堆花括号之内的可选的声明和语句列表

C语言0可以表示false1可以表示true,C++也是如此,而Java不能互等。

X>3返回的不是布尔型,而是01

For while do while switch case break continue略过

判断表达式的长度不需要对表达式求值,sizeof(a=b+1)没有对a赋值

C可以用整型替代布尔型,而Java不行,> >= ....!= ==这些操作符产生的结果都是一个整型,要么返回1,要么返回0

if(expression)    if(!expression)   if(expression==0) ..

C不具备显示的布尔类型,所以使用整数来替代,0是假,非0是真

float型转换为整型时,小数部分被舍弃(并不能四舍五入)

左值意味着一个位置,右值意味着值

编程为了防止副作用,可以赋值调用:t+=f();   t+=g();   t+=h();

表达式的结果如果依赖于求值的顺序,那么它在本质上就是不可移植的,要避免使用

指针

P+1 或者p++并不会对p本身产生副作用

当你根据某个固定数目的增量在一个数组中移动时,使用指针变量将比使用下标产生效率更高的代码,当这个增量是1,这点表现得更为突出

int a[5]

 a++不可以,因为a的值是一个常量但是a+1 a+2等都是可以的

前者是++是本身+1,而后者规定是当前位置后方的位置

结构体:

struct{

}y[20],x;

y包含了20个结构

A[5]是一个结构成员

x.a就是一个数组名

程序执行到底才能定义类型名,所以下面是错误的:

typedef struct{

int a;

Y b;

}Y;

可以这样:

typedef struct SE{

int a;

struct SE *b;

}SEA;

SEA *p;

p+1不能访问,因为这个表达式将指向该数组的下一个结构

*p+1非法,C里没有定义结构和整形之间的加法运算

可是*p++是合法的

C为结构体变量

print(&c)

void print(Translation *c)

就可以->操作数据了,向函数传递指针的缺陷在于函数可以对调用程序的结构变量进行修改

对于绝大多数结构,传递指针效率更高

int *f(); 它的返回值类型是一个int型指针

int *f[] 它的元素类型是指向整形的指针



0 0