《C程序设计语言》笔记 (五) 指针与数组

5.1 指针与地址

指针是一种保存变量地址的变量

ANSI C使用类型void*(指向void的指针)代替char *作为通用指针的类型

一元运算符&可用于取一个对象的地址: p = &c

把C的地址赋值给变量p,我们称p为指向c的指针.地址运算符&只能应用于内存中的对象,即变量与数组元素.

不能作用于表达式 常量或register变量

一元运算符*是间接寻址或间接引用运算符.当它作用于指针时,将访问指针所指向的对象

由于指针也是变量,所以在程序中可以直接使用,而不必通过间接引用的方法使用

  

5.2 指针与函数参数

C语言是以传值的方式将参数传递给被调用函数,因此被调用函数不能直接修改主调函数中的变量的值

  

5.3 指针与数组

通过数组下标所能完成的任何操作都可以通过指针来实现

一般来说,用指针编写的程序比用数组编写的程序执行速度快

在计算数组元素a[i]的值时,C语言实际上先将其转换为 *(a+i)的形式,然后再进行求值,因此在程序中这两种形式是等价的

pa[i] = *(pa+i)

一个通过数组和下标实现的表达式可等价地通过指针和偏移量实现

数组名和指针之间有一个不同之处.指针是一个变量

当把数组名传递给一个函数时,实际上传递的是该数组的第一个元素的地址

在被调用函数中,该参数是一个局部变量,因此,数组名必须是一个指针,也就是一个存储地址值的变量.

  

5.4 地址算术运算

如果P是一个指向数组中某个元素的指针,那么p++将对p进行自增运算并指向下一个元素,而p+=i 将对p进行加i的增量运算,使其指向p当前所指向的元素之后的第i个元素

指针与整数之间不能互相转换,但0是唯一的例外

常量0可以赋值给指针,指针也可以和常量0进行比较

程序中经常用符号常量NULL代替常量0,这样便于清晰地说明常量0是指针的一个特殊值

指针的减法也是有意义的:如果p和q指向相同数组中的元素,且p<q,那么q-p+1就是唯一p和q指向的元素之间的数目

指针的算术运算具有一致性:如果处理的数据类型是比字符型占据更多存储空间的浮点类型,并且p是一个指向浮点类型的指针,那么p++后,p将指向下一个浮点数的地址

有效的指针运算包括相同类型指针之间的赋值运算;
指针同整数之间的加法或减法运算
指向相同数组中元素的两个指针之间的减法或比较运算;
将指针赋值为0或指针与0之间的比较运算

其他所以形式的指针运算都是非法的

  

5.5 字符指针与函数

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

在字符串的内部表示中,字符数组以空字符‘\0‘结尾,所以,程序可以通过检查空字符找到字符数组的结尾.

字符串常量占据的存储单元也因此比双引号的字符数大1

  

5.6 指针数组以及指向指针的指针

指针本身也是变量,所以它们也可以像其他变量一样存储在数组中

  

5.7 多维数组

C语言提供了类似于矩阵的多维数组,但实际上它们并不像指针数组使用的那样广泛

  

5.8 指针数组的初始化

5.9 指针与多维数组

对于初学者来说,很容易混淆二维数组与指针数组之间的区别int a[10][20];int *b[10];从语法上讲,a[3][4]和b[3][4]都是对一个int对象的合法引用

但是a是一个真正的二维数组,它分配200个int类型的长度存储空间

对b来说该定义仅仅分配了10个指针,并且没有对他们初始化,它们的初始化必须以显示的方式进行,比如静态初始化或通过代码初始化

指针数组的另一个优点在于,数组的每一行长度可以不同

指针数组最频繁的用处是存放不同长度的字符串

  

5.10 命令行参数

在支持C语言的环境中,可以在程序开始执行时将命令行参数传递给程序.

调用主函数main时,它带有两个参数

第一个参数不是运行时命令行参数的个数(argc)

第二个参数是一个指向字符串数组的指针,其中每个字符串对应一个参数

UNIX系统中C语言程序有一个公共的约定:以负号开头的参数表示一个可选标志或参数.假定用-X 表示打印所以与模式不匹配的文本行,用-n表示打印行号

  

5.11 指向函数的指针

在C语言中,函数本身不是变量,但可以定义指向函数的指针

这种类型的指针可以被赋值 存放在数组中,传递给函数以及作为函数的返回值等

//指向函数的指针
int (*comp)(void *,void *);

*comp代表一个函数

  

5.12 复杂声明

C语言的声明不能从左至右阅读,而且使用了太多的圆括号

int *f();//f是一个函数,它返回一个指向int类型的指针

int (*pf)(); //pf是一个指向函数的指针,该函数返回一个int类型的对象

它们之间的含义差别说明,*是一个前缀运算符,其优先级低于(),所以声明中必须使用圆括号以保证正确的结合顺序

  

时间: 2024-08-29 05:04:08

《C程序设计语言》笔记 (五) 指针与数组的相关文章

C语言学习笔记(六) 指针和数组

使用C语言就必然会使用到指针和数组.看下面的代码: int main(int argc, char** argv){     int a[4] = {1,3,5,7};     int *p = a;     int i;     for (i=0; i<4;i++){         printf("i=%d, p[i]=%d, *(p+i)=%d, a[i]=%d, *(a+i)=%d\n",                 i, p[i], *(p+i), a[i], *(

程序猿之---C语言细节(指针和数组细节,&quot;//&quot;的可移植性说明)

主要内容:指针和数组细节,"//"的可移植性说明 #include <stdio.h> int main(int argc, char **argv) { int a[10]={1,2,3,4,5,6,7,8,9,0},*p; #if 0 /* 按移植性来说,在<c语言程序设计--现代方法>指出要用当前注释方法,而不是// 因为一些编译可能不支持 */ // 错误举例 while(*a != 0) { a++; // a++ 相当于a = a+1,不能改变a的值

深入理解C语言中的指针与数组之指针篇(转载)

前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情,一直没有时间静下心来写这些东西,毕竟这确实是一件非常耗费时间和精力的事情:一方面,个人对C语言的掌握和理解也还有限,怕写出来的东西会对大家造成误导.当然,今天写的这些东西也肯定存在各种问题,不严谨甚至错误的地方肯定有,也希望大家来共同探讨,相互改进. 我会慢慢的写完这几章,有想法的童鞋可以和我探讨

C语言中的指针与数组

1.指针与数组 1)指针与一维数组 i.数组指针(指向数组元素的指针) 类型  *指针变量名: 指针定义完成后要初始化(不想让指向任何内容,=0,=NULL) int a[10]; int *p = &a[0];   // &a[0] == a int *p1 = a; ii.用数组的指针访问数组元素 偏移:指针变量的偏移 p1 = p1+1;    //向下偏移1个一个数组元素 p1++;   //p1中存放的还是地址 .... 如果用指针访问第i个元素 p1+i 取出pi指向的元素的值

python程序设计语言笔记 第一部分 程序设计基础

1.1.1中央处理器(CPU) cpu是计算机的大脑,它从内存中获取指令然后执行这些指令,CPU通常由控制单元和逻辑单元组成. 控制单元用来控制和协调除cpu之外的其他组件的动作. 算数单元用来完成数值运算(加减乘除)以及逻辑运算(比较) 现在的cpu都是镶在一块小小的硅半导体芯片上,这块芯片上有数百万个被称作晶体管的小电子开关来处理信息. 每台计算机都有一个内部时钟,该时钟会以一个稳定的速度发射电子脉冲,这些脉冲用于同步和控制各种操作的的步调.时钟速度越快,给定时间内执行的指令就越多.时钟速度

C语言中使用指针与数组的区别

在c语言中,指针和数组名都表示地址,但两者却有很大的不同之处,对于初学者来说一定要弄清楚两者的区别. 首先,我举个简单的例子: char *p1="hello!";  //定义字符型指针p1,并将指针p1指向字符串"hello!"的首地址. char s[10]="hello!";  //定义数组s,并将其初始化赋值. 然而,如果char s[10]; s="hello!";这样就会报错,为什么呢?原因很简单,因为数组名是常量

【黑客免杀攻防】读书笔记12 - 指针与数组

1.指针与数组 C源码 前两组printf()函数是以指针方式访问数组nArray中的数据的,而后两组printf()函数则是使用数组下标的方式访问数组nArray中的数据的. int _tmain(int argc, _TCHAR* argv[]) { // 数组赋值 int nArray[3] = {0x10,0x20,0x300}; // 数组地址赋值给指针 int *pPtr = nArray; // 输出指针中地址 printf("%x %x %x\r\n", pPtr+0,

C语言中的指针和数组

下面的内容节选自由我所执笔的会议记录.对于本文的不足之处,各位可以提出自己的看法. Q1:指针和数组到底是怎么一回事? A:指针和数组有本质的不同.指针就是一个内存地址,在32位系统下,一个指针永远占4个字节:数组是一块连续的内存空间,我们从一个已定义的数组中可以获得数组大小以及这块连续内存空间的起始地址.这个起始地址即数组首元素的地址,更具体的说是数组中首个元素的首地址. 在C语言中,只有一维数组.但是,当一个一维数组的元素是仍然是一维数组时,就形成了所谓的一维数组.如何印证这一点?二维数组在

C语言-再论指针与数组

指针与数组的天生姻缘1.以指针方式来访问数组元素(1).数组元素使用时不能整体访问,只能是单个访问.访问形式有两种:数组形式和指针形式.(2).数组形式访问数组元素:数组名[下标]:(下标从0开始(3).指针格式访问数组元素:*(指针+偏移量);(4).数组下标方式和指针方式均可以访问数组元素,两者的实质是一样的.在编译器内部都是用指针方式来访问数组的,数组下标方式只是编译器给编程者提供了一种壳而已.所以用指针方式来访问数组才是本质的做法.2.从内存角度理解指针访问数组的实质(1).数组的特点就