c语言指针发明历史,C语言指针强化

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表达式中使用标量类型的值时,编译器就会自动将这些标识符转换为整数保存。

这种机制的作用是,在这些标量类型上执行的操作与整型上执行的操作完全一样。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值