C语言发展史
UNIX最早是由汇编写的,之后改成B语言,随后改进成NB(new B),NB最后就改称为C语言了。
一开始由于运行环境的不同程序运行也有差异,经过一番纷争,终于在1989年通过了C语言的标准规范,就是我们常说的ANSI C,目前大多数C语言程序都是基于此标准。ANSI C后来被ISO采用,目前真正的标注应该是ISO-C标准。
C语言精神
- 请信任程序员(Trust the programmer)
- 不要阻止程序员去做需要做的工作(Don't prevent the programmer from doing what needs to be done)
3.保持语言的小巧和简单(Keep the language small and simple) - 为每一种操作只提供一种方式(Provide only way to do an operation)
- 就算不能保证可移植性,也要追求运行效率(Make it fast , even if it is not guaranteed to be portable)
指针类型
同int类型、char类型等类型一样,指针类型也是一个类型。
不同的是,指针类型是通过其他类型派生出来的类型,例如指向int的指针类型、指向char的指针类型....
解引用*
int a = 5;
int *p;
p=&a;
&取址符,可以获得变量在内存中的地址的值。
*运算符,等同于它指向的变量。
其中p和a代表同一个事物,可以通过p来输出a的值,也可以通过*p对a进行赋值。
指针变量混乱的声明方式
通常C语言声明一个变量会这样写
int tmp;
类型 变量名;
指向int的指针通常这样写
int *tmp_p;
似乎声明了一个*tmp_p这么一个指针类型的变量,其实这里声明的变量是tmp_p,tmp_p的类型是“指向int的指针”。
因为有人觉得这种书写方式不方便理解,建议*应该靠左书写
int* tmp_p;
的确,这种书写方式更符合 “类型 变量名”的形式,但是如果遇到同时声明多变量的问题,就会出现与预期不符的问题了。
int* tmp_p,tmp2_p; 这样的话会声明出两个变量
tmp_p是指向int的指针
tmp2_p是int类型的变量
关于main函数
常见的有
int main(int argc, char *argv[])
或者不需要参数
int main (void)
或者单片机中不需要返回值
void main (void)
推荐前两种写法,单片机除外,若不是单片机代码,用第三种方式写的话理论上是错误的,会报缺少返回值的警告。
可以指向任何类型的指针类型 void *
取变量的值之前需要强制转换类型
int main(int argc, char *argv[]) {
int hoge =5;
void *hoge_p;
hoge_p = &hoge;
printf("%d\n",*(int *)hoge_p);
return 0;
}
指针运算
- 对于指针的加减运算,严格来说只允许指针指向数组内的原酸,或者超过数组长度的下一个原酸,指针运算的结果也只允许指向数组内的元素,以及超过数组长度的下一个元素。
- 在C语言中,对指针进行加1操作,地址的值会增加当前指针所指向数据类型的长度。
C语言传参问题
写一个交换数值的函数
void swap(int a, int b)
{
int temp;
temp=a;
a=b;
b=temp;
}
int x,y;
x=5;
y=10;
swap(x,y); 这里的交换是失败的,传递的参数是变量的副本,无法改变原变量的值。
printf ("x..%d,y..%d",x,y);
void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
swap(&a,&b); 通过指针来操作原来的变量,而不是原变量的副本。
早期的C语言一度只支持标量运算
在C语言中,枚举类型、字符型和各种整数的表示形式统一叫做标量类型。
当在C表达式中使用标量类型的值时,编译器就会自动将这些标识符转换为整数保存。
这种机制的作用是,在这些标量类型上执行的操作与整型上执行的操作完全一样。
网友评论