C和指针
来源:互联网 发布:linux chgrp命令 编辑:程序博客网 时间:2024/06/03 21:02
最近看程序写代码发现在C语言上基础很薄弱,虽说大学四年学了之后也常有用到,但都是十分简单的应用,对于结构体和指针的认识上非常的不足,便找了《C和指针》这本书过来看,发现这本书对讲得非常的好,特别是结构体和指针,同时也补充了不少基础方面的知识,所以对这本书非常推崇。
static
static关键字使用范围主要分为代码块外和代码块内
在代码块外用static声明变量时,其主要作用是将变量的链接属性从external变为internal,使其作用域被限制在当前文件中,外部其他文件代码不能通过external引用这个变量,在多文件程序中,用static关键字修饰的同名变量互不影响。
在代码块内,static关键字将变量的存储类型从自动变量修改成静态变量,即变量的值放在普通内存而非堆栈里面,在代码块程序执行之前创建并一直持续到执行完毕才销毁。
数组
int a[10]
对数组a[10],&a[0]和a的值是一样的,都是指向数组第一个元素的指针。在c语言中指针表达式和下标表达式可以互换,对数组可以用*(a+num)和a[num]两种方式访问,一般而言,下标绝不会比指针更有效率,但指针有时候会比下标更有效率。
指针数组 int *api[10]
下标引用的优先级高于声明,所以这个表达式中,首先执行下标引用,在取得数组元素后随即执行间接访问,故不同于int* a,b 中b只是一个整型数据而非指针,api[10]是十个指向整型的指针构成的数组。
结构体
struct SIMPLE {
int a;
int b;
struct SIMPLE *p;
};
struct SIMPLE *ap,sim;
结构成员的两种访问方式:sim.a和ap->a;点操作用于对结构变量的直接访问。但当定义了指向结构的指针时,访问结构成员就用(*ap).a的方式,但针对于结构指针,c语言提供了更为方便的操作符来完成这一功能,->操作,->操作的左值必须是指向结构的指针。同时计算结构体占内存大小的时候必须将边界对齐考虑进来。
结构的自引用,结构成员*p就是结构的自引用,用SIMPLE 类型的指针指向一个SIMPLE 结构,这样每个结构的指针指向同样数据类型的不同结构,利用这一特点就可以构成链表、树等更加高级的数据结构。注意自引用的变量是一个指针而不是实在的结构,一个结构包含类型为该结构的成员是不合法的。
指针
对于指针主要掌握好*和&两个操作符的运用。对于一个数据将其分成三个属性:数值,存放地址,数据类型。
对普通的数据,如int a,其数值表达式为a,地址表达式为&a,数据类型为int型,对其进行*操作是非法的。
而对于指针,如int *p=&a,其数值表达式同样为p,只不过此时的p值是数据a的地址&a,我们称为p指向a的地址;地址表达式为&p,数据类型为int*型,但对其进行*操作具有特殊意义,即*p表示p值(即&a)所指向地址中的数据,即是a的值。
理解了*和&,对于指向指针的指针我们也不难理解,如int **pp=&p,即数值表达式pp是指针p的地址&p,地址表达式为&pp(当有指向指针的指针的指针时,其值为&pp),数据类型为int **型,*pp操作即为pp所指向地址(&p)中的数据,就是p,而p=&a,*pp为数据a的地址,所以要取a的值时,再进行一次间接访问*即可,故**pp的值就是a的值。由此类推,对于多重指针并不难理解。
为了加深对于*和&的理解,分析&*pp和*&pp的值,pp的值为指针p的地址&p,*pp即为地址&p中的值p,对*pp(p)再进行取地址操作&,所以&*pp就是地址&p,也就是pp;而&pp即为指针pp存放的地址,对其进行间接访问*操作,则为&pp中的值pp,与&*pp操作结果相同。
当使用指针逐个指向数组或字符串时(int a[] = {1,...,10};int *p = a;),使用下标的方式(p[i++])要好于*p++,因为下标并没有改变指针p的指向,而*p++实际上通过改变指针指向引用数组变量,这样有可能会指向不该指向的地方。
- c和c指针
- 【C和指针】函数指针
- 【C和指针】const指针
- 《c和指针》函数指针
- c和指针详解------指针
- C指针和指针的指针
- 【c/c++】指针数组和数组指针
- 【c/c++】指针函数和函数指针
- C和指针
- c和指针
- C和指针学习
- 《C 和指针》
- C和指针
- c和指针
- 002-C和指针
- C和指针
- C和指针
- c++---数组和指针
- 对面试题“输入n,求一个nXn矩阵,规定矩阵沿45度递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用C++实现?”的理解
- TCP/IP 详解翻译中的疑问 .
- Android应用开发揭秘的第22,23个程序5_17_frame,5_18_framexml修改版和高仿版的源码注释
- [C++]数据结构:有序链表SortedChain的基本实现与操作
- Linux下C语言实现字符串子串替换
- C和指针
- 支持向量机通俗导论(理解SVM的三层境界)
- 寻求老师指导
- perl中的typeglob(二)
- shell 学习
- Ubuntu软件安装位置
- JDK 源码阅读笔记(一)--OutputStream
- 批处理for命令/f参数的用法
- Servlet Filter(过滤器)、Filter是如何实现拦截的、Filter开发入门