【读书笔记】《C和指针》第八章

·     int arr[4]  这个数组中,arr[4]的类型是整形,它表示这个数组中下标为4的元素(即第五个元素)

而arr则表示数组arr的首地址, arr的类型是:指向int(这里因为定义是int 如果定义成char,则是指向char,以此类推)的常量指针

·     大部分情况下,数组名arr都作为数组的首元素地址 只有两种情况例外

1.siziof(arr) :返回值为数组的长度

2.&arr             :指向数组的指针  (和arr等价)

·     数组名arr是个常量,它不能被修改

例如 arr = 2 这样的表达式是非法的

·     *(array + 3) 和array[3] 这两个访问方式,前者是间接访问,后者是下标引用,

这两种方式的作用完全相同,优先级不同

两种访问方式做比较:

可读性方面,下标访问有优势,但,贴一段话:

下标绝不会比指针更有效率,但指针有时会比下标更有效率

这里还有一篇博文,作者通过编程实例比较说明两种访问方式的效率差异

贴上来,有时间看看:

http://blog.sina.com.cn/s/blog_615ec1630102uxo1.html

(其实也都是这本书里的内容)

·     提高指针效率的方法

1、当你根据某个固定数目的增量在一个数组中移动时,使用指针变量将比使用下标产生效率更高的代码。当这个增量式1并且机器具有自动增量模型时,

这点表现得更为突出。

2、声明为寄存器变量的指针通常比位于静态内存和堆栈中的指针效率更高(具体提高的幅度取决于你所使用的机器)

3、如果你可以通过测试一些已经初始化并经过调整的内容来判断循环是否应该终止,那么你就不需要使用一个单独的计数器

4、那些必须在运行时求值的表达式往往代价更高

当然,在提高效率的同时,也要注意程序的可读性,两者间一定要合理取舍

·     声明一个数组,编译器根据你指定的元素数量在内存里开辟空间,所以声明的这个数组是个常量

而声明一个指针,编译器只为指针本身保留内存空间,因此它是一个变量

int a[5];   这个表达式是合法的

int *b;     这个表达式是非法的

所以注意,在声明和定义一个指针变量的时候,一定要在定义的同时进行初始化

·     当一个数组名作为参数传递给一个函数,传递的是数组首地址

·     对一个函数,如果传入的参数是一个值,那么在这个函数中你可以对这个参数随意修改,并不会改变这个参数在主函数中的值

而如果传入的是一个地址(比如数组),函数中对它的修改则会影响主函数中它本身的值。

·     数组作为参数传递给函数:

int fun(char *p)

int fun(char p[])

第一种更准确,写代码的时候应该用第一种,如果需要知道数组的长度,应该再把长度也作为一个参数传递进来

·     字符数组的初始化:

char message = {‘H‘, ‘E‘, ‘L‘, ‘L‘, ‘O‘ ,0};

char message = {‘H‘, ‘E‘, ‘L‘, ‘L‘, ‘O‘ , ‘\0‘};

char message[] = "HELLO";

·     看这段代码:

int main()

{

char message1[] = "hello" ;  //message1为一个数组,长度为6,内容为 h e l l o \0

char *message2 = "hello" ;   //message2为一个指针 指向字符串常量 hello

printf( "1:%s\n", message1);

printf( "2:%s\n", message2);

return 0;

}

两个printf打印的结果都是hello  但message1、message2本质是不同的

message1是一个数组 message2是一个字符串常量

相应的,你可以对message1数组中的元素进行修改

而message2作为一个字符串常量,其内容是不能修改的

·      二维数组的下标、查找与指针

设有一个二维数组 arr[3][4]

*(*(arr + 2) + 3) 和 arr[2][3] 访问的是相同的元素。

·     指向二维数组的指针

int arr[3][10];

int (*p)[10] = arr;

使用 *(*p + i) 表示访问数组中的第i个元素。  比如i= 15 表示arr[1][4]

·

时间: 2024-10-10 00:35:15

【读书笔记】《C和指针》第八章的相关文章

R in action读书笔记(10)-第八章:回归-- 异常观测值 改进措施

8.4 异常观测值 8.4.1 离群点 car包也提供了一种离群点的统计检验方法.outlierTest()函数可以求得最大标准化残差绝对值Bonferroni调整后的p值: > library(car) > outlierTest(fit) rstudent unadjusted p-value Bonferonni p Nevada 3.542929 0.00095088 0.047544 可以看到Nevada被判定为离群点(p=0.048).注意,该函数只是根据单个最大(或正或负)残差值

读书笔记 - js高级程序设计 - 第八章 BOM

BOM的核心对象是window 它表示浏览器的一个实例,在浏览器中,window对象有双重角色,它既是通过js访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象,这意味着在网页中定义的任何一个对象,变量 和 函数 都以window作为其Global函数 窗口关系和frame 每个frame都有自己的window对象,并且保存在frames集合中, 在frames集合中,可能通过数值索引 或者 框架名称来访问 相应的 window 对象 top 始终指向 最高层的 框架,也就

R in action读书笔记(8)-第八章:回归(上)

8.1回归的多面性 8.2 OLS回归 OLS回归拟合模型形式: 为了能够恰当地解释oLs模型的系数,数据必须满足以下统计假设. 口正态性对于固定的自变量值,因变量值成正态分布. 口独立性Yi值之间相互独立. 口线性因变量与自变量之间为线性相关. 口同方差性因变量的方差不随自变量的水平不同而变化.也可称作不变方差,但是说同方差性感觉上更犀利. 8.2.1用lm()拟合回归模型 myfit<-lm(formula,data) formula指要拟合的模型形式,data是一个数据框,包含了用于拟合模

R in action读书笔记(11)-第八章:回归-- 选择“最佳”的回归模型

8.6 选择“最佳”的回归模型 8.6.1 模型比较 用基础安装中的anova()函数可以比较两个嵌套模型的拟合优度.所谓嵌套模型,即它的一 些项完全包含在另一个模型中 用anova()函数比较 > states<-as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")]) > fit1

R in action读书笔记(9)-第八章:回归 -回归诊断

8.3回归诊断 > fit<-lm(weight~height,data=women) > par(mfrow=c(2,2)) > plot(fit) 为理解这些图形,我们来回顾一下oLs回归的统计假设. 口正态性当预测变量值固定时,因变量成正态分布,则残差值也应该是一个均值为0的正态分布.正态Q-Q图(Normal Q-Q,右上)是在正态分布对应的值下,标准化残差的概率图.若满足正态假设,那么图上的点应该落在呈45度角的直线上;若不是如此,那么就违反了正态性的假设. 口独立性你无

读书笔记2014第4本:程序员修炼之道-从小工到专家(第七、八章)

第七章 在项目开始之前 36 需求之坑不为收集需求,挖掘它们.有一种能深入了解用户需求,却未得到足够利用的技术:成为用户.与用户一同工作,以像用户一样思考.描述需求文档时,要使用项目术语表.用WEB来收集和管理需求. 37 解开不可能解开的谜题遇到不可能解决的问题时,退一步问问自己如下问题:1)有更容易的方法吗?2)你是在设法解决真正的问题,还是被外围的技术问题转移了注意力?3)这件事情为什么是一个问题?4)是什么使它如此难以解决?5)它必须以这种方式完成吗?6)它真的必须完成吗? 38 等你准

Java 线程第三版 第八章 Thread与Collection Class 读书笔记

JDK1.2引入最有争议性的改变是将集合类默认为不是Thread安全性的. 一.Collection Class的概述 1. 具有Threadsafe 的Collection Class: java.util.Vector(List) 列表集合,通过索引操作. java.util.Stack(List) 继承自Vector,提供LIFO的顺序操作push进入,pop出元素. java.util.Hashtable(Map) 一个简单.无序的key与value的映射. java.util.conc

《Java并发编程实战》第八章 线程池的使用 读书笔记

一.在任务与执行策略之间的隐性解耦 有些类型的任务需要明确地指定执行策略,包括: . 依赖性任务.依赖关系对执行策略造成约束,需要注意活跃性问题.要求线程池足够大,确保任务都能放入. . 使用线程封闭机制的任务.需要串行执行. . 对响应时间敏感的任务. . 使用ThreadLocal的任务. 1. 线程饥饿死锁 线程池中如果所有正在执行任务的线程都由于等待其他仍处于工作队列中的任务而阻塞,这种现象称为线程饥饿死锁. 2. 运行时间较长的任务 Java提供了限时版本与无限时版本.例如Thread

《C++ Primer 4th》读书笔记 第4章-数组和指针

原创文章,转载请注明出处: http://www.cnblogs.com/DayByDay/p/3911573.html <C++ Primer 4th>读书笔记 第4章-数组和指针

Android深度探索——第八章读书笔记及心得

蜂鸣器驱动 ——第8章读书笔记及心得 通过本章的学习,学会了pwm的驱动实验,知道了蜂鸣器实现的原理.蜂鸣器是开发板上的一个硬件设备,可以通过向寄存器写入特定的值来控制蜂鸣器发出尖叫声.本实验将linux驱动区分成了多个实现文件.学会了编写Makefile文件.知道了linux驱动模块的依赖.通过实验学会了linux驱动常用的代码重用方式及强行卸载linux驱动的方法. 在C语言中编译多个源代码文件时,如果a.c使用了b.c文件中的函数,需要在a.c文件中使用extern预先定义b.c中的函数,