C和指针 (pointers on C)——第六章:指针(上)

第六章 指针

这一章,就明显触痛初学者敏感之处了。我也是在一段时间不用C以后就会对这一部分生疏,好吧,其实是对高级指针那块生疏。

当然这一部分总有很多借鉴之处,比如数组范围的问题等,要不我也不会大夏天的这么虐自己看这种书。

总结:

指针变量的值并非它所指向的内存位置所存储的值,而是保存了指向的变量的地址。需要通过间接访问符*来访问指向的变量的值。

单单声明一个指针,而并不进行初始化,是不会分配内存的。所以在指针执行间接访问之前,指针必需进行初始化。

要么指向某个变量、要么去malloc一个内存。

NULL指针就是不指向任何东西的指针。除了NULL指针之外,再也没有任何内建的记法标识指针常量。除非是用 volatile 0x00...这么命名,这在现在PC系统看来是不可想象的。在极少见的情况下,我们偶尔需要用到指针常量。

指针可以作为一个左值来用,因为指针标识了一个特定内存位置。

比如: ptr = ¶

*ptr = para;

在指针值上可以执行一些有限的算术运算。你可以把一个整型值加到一个指针上,也可以从一个指针减去一个整型值。在这两种情况下,这个整型值会进行调整,原值将乘以指针目标类型的长度。

需要注意的是,指针的大小就是一个字节,因此对一个指针加1,让它指向下一个空间,这与该指向的变量是float double没有半毛钱的关系。

指针间的相互运算,只有用于数组之中其结果才是可以预测的,对于那些非数组元素的运算,最好不要去用,肯定是非法的,只不过IDE没有报错。

当减法的时候,如果指针指向数组首元素之前的位置,非法。

当加法的时候,如果指针指向数组末元素之后的一个位置,合法,但再往后,非法。一般不要触碰这个底线。

如果两个指针都指向同一个数组的元素,它们可以相减,表示数组中相隔多少个元素。

如果两个指针不指向同一个数组,那么它们相减是错误的。

关于关系运算,最简单最常见的是测试它们相等或者不相等。

如果两个指针都指向同一个数组的元素,那么它们还可以用>=,>,<,<=这几个元素。

警告:

1、错误地对一个未初始化的指针变量进行解引用。

int *a;

...

*a = 12;

a指向一个位置量,如果a是静态的,那么它会被初始化为0,如果a是自动的,那么它不会被初始化,无论哪种情况,仅仅声明一个指针变量是不会开辟一个内存空间。

window比较温柔,一般就是终止程序,倒霉的时候会产生保护性异常(General Protection Exception)。unix里面管其叫做 memeory fault,它提示程序试图访问一个未分配给程序内存的位置。

一定要注意,在调用指针时候,确保它们已经被初始化。

2、错误地对一个NULL指针进行解引用。

int *a;

a = NULL;

temp = *a; //wrong!

3、向函数错误地传递NULL指针。

这种错误纯属活该,在传递之前,必需检测函数的有效性。

4、未检测到指针表达式的错误,从而导致不可预料的结果。

比如:当声明一个指针的时候,如果已经知道被初始化什么地址了,就初始化,否则就初始化为NULL,这是个好事,大大节省调试时间。

5、对一个指针进行减法运算,使它非法地指向了数组第一个元素的前面的内存位置。

见上!

编程提示:

1、一个值应该只具有一种意思。

2、如果指针并不指向任何有意义的东西,就把它设置为NULL。

问题?

5、 int i[10];

int *p = & i[0];

int offset;

p += offset ; (a)

p += 3;         (b)

a/b区别是什么?

答:求值过程没有区别,但是a多一步数组越界的检查。

6、int array[ARRAY_SIZE];

int *pi;

for( pi = &array[0]; pi < &array[ARRAY_SIZE];)

*++pi = 0;

错误在哪?

答:目的是将array数组清零,但是array[0]没有清零,因为++前缀了。同时,多清了一个零,array[ARRAY_SIZE-1]后面一个内存空间也被清零了。

C和指针 (pointers on C)——第六章:指针(上)

时间: 2024-11-05 16:23:36

C和指针 (pointers on C)——第六章:指针(上)的相关文章

第六章 指针6.2 6.3字符串中查找的两个版本

int find_char(char **strings, char ch) { char *string; while ((string = *strings++) != NULL) { while (*string != '\0') { if (*string++ == ch) { return TRUE; } } } return FALSE; } 无副作用版本,适合多次查找. int find_char(char **string, char ch) { while (*string !

指针(选自-第六章——C Primer)

未初始化和非法的指针: 例如:int *a: *a=10: 在创建一个指针变量时没有初始化,所以不确定a会指向哪里,所以只后我们没有办法预测这个10将会存储在什么地方. 所以在对指针进行间接访问前必须十分小心,需要确保它们已经初始化. NULL指针 是一个特殊的指针变量,表示不指向任何东西,要使一个指针变量为NULL可以给它赋零值. 对NULL指针进行解引用操作是非法的,因为他不指向任何东西.

深入理解 C 指针阅读笔记 -- 第六章

Chapter6.h #ifndef __CHAPTER_6_ #define __CHAPTER_6_ /*<深入理解C指针>学习笔记 -- 第六章*/ typedef struct __person { char* name; char* title; unsigned int age; }person; /*结构体内存的释放问题*/ void __struct_memory_test(); #endif Chapter6.cpp #include "Chapter6.h&quo

C和指针 (pointers on C)——第六章:指针(下)习题

有一定的难度,作者只做了前三题! 题目请见 http://download.csdn.net/download/wangpegasus/5701765 1. char *find_char(char const *source, char const *chars) { char *ptr; if(source != NULL && chars != NULL) { for (; *source != '\0'; source++) { for (ptr = (char *) chars;

C和指针 (pointers on C)——第一章:快速上手

不太苟同大多数人认为很多程序员没有几个学C学的好的,那就多看看这本书. 本人只是作为读书笔记来写.有时候会附带一些题目和解答. 开通此类专栏,既为敲砖引玉,也为自勉,望鼓励! 第一章:快速上手 我每次都是复习的来写.我想是这一章,哪怕是上手也需要有一定的C基础. 总结:提出了stdio.h中一些基本的函数,如scanf(),printf(),getchar(),putchar(),gets(),puts()等io函数. 关于NULL和NUL的区别也说了一些. NUL也就是字符串中的截尾字符'\n

C和指针 (pointers on C)——第二章:基本概念

第二章 基本概念 不良的代码风格,不良的文档直接导致软件开发及维护代价高昂. 其实一个人总有他自己的代码风格,主要是坚持一种合理的风格,让大家容易读懂. 总结: C是一种对大小写非常敏感的语言,所以Abc,abc这是两个不同的标识符.长度没有限制,但是31个字符以后会自动忽略. 程序的起点是main函数,绝大多数环境使用堆栈来存储局部变量和其他数据. 注释必需以/* 开始,*/结束,不允许嵌套.注释将被预处理器去除. 标识由字符数字和下划线组成,不能以数字开头,大写和小写不同. 关键字不能作为标

C语言学习书籍推荐《C和指针 Pointers On C》下载

<C和指针 POINTERS ON C>提供与C语言编程相关的全面资源和深入讨论.本书通过对指针的基础知识和高 级特性的探讨,帮助程序员把指针的强大功能融入到自己的程序中去.  全书共18章,覆盖了数据.语句.操作符和表达式.指针.函数.数组.字符串.结构和联合等几乎所有重要的C编程话题.书中给出了很多编程技巧和提示,每章后面有针对性很强的练习,附录部分则给出了部分练习的解答.  本书适合C语言初学者和初级c程序员阅读,也可作为计算机专业学生学习c语言的参考. 下载地址:点我 编辑推荐 本书通

第六章:数组、指针、与字符串

主要内容: 1.数组 2.指针 3.动态存储分配 4.指针与数组 5.指针与函数 6.字符串 内存地址: 1.内存地址的访问方式 通过变量名访问 通过地址访问 2.& var; //表示var在内存中的起始地址 void类型的指针就相当于一个hook(钩子),可以指向任何数据类型. 1.const 数据类型 * ptr //指向常量的指针 常量指针不可以改变所指对象的值,但是可以指向另外的对象(ptr本身可以改变). 2.数据类型 * const ptr //指针常量 指针本身不能改变,只能指向

C++ 之 第六课 指针和数组

c++语言中大部分程序都离不开指针和数组,所以,我们有必要弄清楚指针和数组. 首先定一个字符数组char s[10];然后定义一个指向字符的指针char* p;数组用[]来申明,而*则表示指针.数组是以0作为下标开始,s有10个元素,从s[0]...s[9].指针可以保存它的地址如: p = &s[1];// 这句话表示了p指向了s的第2个元素.&是取地址运算符. 那么指针到底是什么东西?为什么它会有如此大的魔力?如果你了解了汇编的基础知识.其实也不难理解?简单的解释就是它保存了一个对象的