最近竟然对指针有些迷惑了,分不清指针的指向。废话少说,复习.(下面内容来自<<c和指针>>)

=指针

==内存和地址

尽管一个字包含了4个字节,它仍然只有一个地址。至于是最左边还是最右边那个字节的位置
,不同机器有不同的规定。 要求边界对其的机器上,整型值储存的起始位置只能是某些特定的字节,通常是2或4的倍数. ==指针变量的内容 & 符号用来产生操作数的内存地址。 ==间接访问 通过一个指针访问它所指向的地址的过程成为间接访问或 dereferencing the pointer
(解引用指针). ==未初始化和非法的指针 指向你猜不到的地方。所以,初始化吧。(这个原文没有) ==NULL 指针 __标准定义了NULL指针__,特殊的指针变量,表示不指向任何东西。 ==指针,间接访问和左值 当混用指针和整形值时,__旧式的__编译器并不会发出抱怨。(强制转换吧) ==指针,间接访问和变量 *&a = 25;
这样的代码意味着有人想XX(表现一下的缩略词); ==指针常量 下面这个表达式是__错__的。
*100 = 25; 下面这个表达式是对的.表示 向地址为 100 的内存赋值 25;
*(int *)100 = 25; ==指针的指针
没什么好说的 ==指针的运算 指针加上一个整数的结果是另一个指针。偏移量是指针指向类型的大小. ===算术运算 指针-指针
结果类型是 ptrdiff_t, 有符号整型。两个指针相隔的元素类型大小为单位的长度.
__只有__当两个指针都指向__同一个数组__中的元素,才允许. 大多数编译器不会检查指针表达式结果是否位于合法的边界之内。所以,小心. ===关系运算 < <= > >= ,要求同上. ==总结 声明一个指针变量并不会自动分配任何内存. ==编程提示的总结 如果指针并不指向任何有意义的东西,就把他设置为NULL。 =数组 ==一维数组 ===数组名 在c中,在几乎所有使用数组名的表达式中,数组名的值是一个__指针常量__,也就是数组
第一个元素的地址. 数组具有一些和指针完全不同的特征。如数组具有确定数量的元素. 只有两种场合下,数组名并不用指针常量来表示,就是当数组名作为 sizeof 操作符或
单目操作符 & 的操作数时. sizeof 返回整个数组的长度,而不是指向数组的指针的长度. 取数组名的地址所产生的是一个指向数组的指针,而不是指向某个指针常量的指针. ===下标引用 下面的表达式是相同的.
array[subscript] // a[2]
*(array + (subscript)) // *(a + (2))
subscript[array] // 2[a] ==指针与下标 ===结论 当你根据某个固定数目的增亮在一个数组中移动时,使用时针变量将比使用下标产生效率
更高的代码. 声明为寄存器变量的指针通常比位于静态内存和堆栈中的指针效率更高. 如果你可以通过测试一些已经初始化并经过调整的内容来判断循环是否因该终止,那么你就
不需要使用一个单独的计数器. 那些必须在运行时求值的表达式 如 array+SIZE 往往代价更高. ===数组和指针 声明一个数组时,编译器将根据声明所指定的元素数量为数组保留内存空间,然后在创建数组名
,它的值是一个__常量__. ===作为函数参数的数组名 你现在已经知道数组名的值就是一个指向数组第一个元素的指针,所以很容易明白此时传递给
函数的是一份该指针的拷贝. ==声明数组的参数 下面两个函数原型是相等的 -------------
int strlen(char *string);
int strlen(char string[]);
------------- ==多维数组 ===数组名 指向数组的指针这个概念是在相当后期才加入到 K&R C 中的,有些老式的编译器并没有完全实现
它,但是,指向数组的指针这个概念对于理解多维数组的下标引用是至关重要的. ===下标 下面的式子是相等的
*(*(matrix + 1) + 5)
matrix[1][5] 关于 matrix[4, 3] .里面是个逗号表达式阿。就是 matrix[3]; int (*p)[] = matrix;
p 仍然是一个指向整型数组的指针,但数组的长度却不见了。当某个整数与这种类型的指针执行
指针运算时,它的值将根据空数组的长度进行调整(也就是说,与_零_相乘),这很可能不是你所
设想的。有些编译器可以捕捉到这类错误,但有些编译器却不能. ===作为函数参数的多维数组 ---------------
int matrix[3][10]; /* 这个是函数的调用形式,后面的是函数定义 */
func2(matrix); /* 下面两个是正确的 */
void func2(int (*mat)[10]);
void func2(int mat[][10]); /* 这个是不正确的 */
void func2(int **mat);
--------------- 最后一个例子是把 mat 声明为一个指向整型指针的指针,它和指向整型数组的指针并不是一回事。 .....后面的高级部分不写了。发现疑问再整理.

<<c 和指针 >> 部分笔记。的更多相关文章

  1. C和指针---读书笔记。

    C和指针---读书笔记.1,unsigned int  声明无符号int类型 默认是 singned,即此整数类型包括正负数.也可用于long上.说明符有 unsigned signed short ...

  2. C++中的智能指针、轻量级指针、强弱指针学习笔记

    一.智能指针学习总结 1.一个非const引用无法指向一个临时变量,但是const引用是可以的! 2.C++中的delete和C中的free()类似,delete NULL不会报"doubl ...

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

    Chapter6.h #ifndef __CHAPTER_6_ #define __CHAPTER_6_ /*<深入理解C指针>学习笔记 -- 第六章*/ typedef struct _ ...

  4. 深入理解 C 指针阅读笔记 -- 第二章

    Chapter2.h #ifndef __CHAPTER_2_ #define __CHAPTER_2_ /*<深入理解C指针>学习笔记 -- 第二章*/ /* 内存泄露的两种形式 1.忘 ...

  5. 深入理解 C 指针阅读笔记 -- 第五章

    Chapter5.h #ifndef __CHAPTER_5_ #define __CHAPTER_5_ /*<深入理解C指针>学习笔记 -- 第五章*/ /*不应该改动的字符串就应该用 ...

  6. C++11智能指针读书笔记;

    智能指针是一个类对象,而非一个指针对象. 原始指针:通过new建立的*指针 智能指针:通过智能指针关键字(unique_ptr, shared_ptr ,weak_ptr)建立的指针 它的一种通用实现 ...

  7. 《征服 C 指针》笔记6:练习——挑战那些复杂的声明

    应该是小试牛刀的时候了. 在 ANSI C 的标准库中,有一个 atexit()函数.如果使用这个函数,当程序正常结束的时候,可以回调一个指定的函数. atexit()的原型定义如下: int ate ...

  8. C++指针学习笔记

    本文参考http://www.prglab.com/cms/pages/c-tutorial/advanced-data/pointers.php 1.存储其它变量地址的变量(如下面例子中的addre ...

  9. C和指针 读书笔记

    准备复习一下之前读过的<C和指针>,主要看之前标记过的地方. 感觉像第一次看的地方再记录一下-- 1.预处理器读入源代码,根据预处理指令对其进行修改,然后将修改后的源代码交给编译器. 2. ...

随机推荐

  1. 说说iOS中的手势及触摸

    一.响应链 在IOS开发中会遇到各种操作事件,通过程序可以对这些事件做出响应. 首先,当发生事件响应时,必须知道由谁来响应事件.在IOS中,由响应者链来对事件进行响应,所有事件响应的类都是UIResp ...

  2. TypeError: Object #<IncomingMessage> has no method 'flash'

    JavaScript相关代码: router.post('/reg', function(req, res) { //检验用户两次输入的口令是否一致 if (req.body['password-re ...

  3. c++ 信号量

    最近写了个c++项目,发现 ctrl + c 退出程序可以出发析构,但kill pid,则不会触发析构,导致现场数据丢失. 解决方案:同时捕捉以下信号. signal(SIGINT, &完成命 ...

  4. Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition) D. Little Artem and Dance

    题目链接: http://codeforces.com/contest/669/problem/D 题意: 给你一个初始序列:1,2,3,...,n. 现在有两种操作: 1.循环左移,循环右移. 2. ...

  5. Intellij IDEA14 下添加ExtJS提示支持

    前言: 虽然Interlij IDEA比起Eclipse对待EXT更为支持,但自己上手后总不能达到Intellij 开发ExtJS 应用指南(http://blog.csdn.net/s4640368 ...

  6. SqlBulkCopy 简单运用

    using(SqlConnection conn = new SqlConnection(str)) { conn.Open(); using (System.Data.SqlClient.SqlBu ...

  7. [nowCoder] 子数组最大乘积

    给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积.例如arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以 ...

  8. 【C# 反射泛型】

    C# 反射泛型 摘自:http://www.itwis.com/html/net/c/20110411/10175.html C#泛型反射和普通反射的区别,泛型反射和普通反射的区别就是泛型参数的处理上 ...

  9. 如何通过热修复,搞定开发中的那些 Bug?

    作为程序员,Bug 修复终究是绕不开的话题,本期移动开发精英俱乐部讨论的主题便是 Bug 修复中的 Hotfix,即热修复.接下来让我们跟随大牛的脚步来了解 Hotfix,就算你不能一下豁然开朗,相信 ...

  10. CentOS中实现Nginx负载均衡和反向代理

    一.安装必要软件 负载均衡服务器:IP设置为192.168.1.10 Web服务器1:安装Apache或者Nginx,IP设置为192.168.1.11: Web服务器2:安装Apache或者Ngin ...