C语言程序设计---读书笔记2

· 读书笔记按照章节记录,原书作者 丹尼斯里奇

· 笔记  C语言程序设计---读书笔记1

· 笔记中相同的知识点可能来自书中不同的章节

· 解释与思考部分并不全是书中的内容,也包括经验之谈、网上资料

   指针与数组

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

5.1指针与地址

对变量取地址用运算度 &,取指针指向的地址取内容用 *

解释与思考5.1

已知:  int  a = 7int *p = &a;

区分:  *p +1 (*p)++ ++*p *p++ *++p

  • ++ * 的优先级一样
  • ++ * 的运算符为右至左的结合性,( man  operator)
  • 相同优先级的运算符拥有相同的结合性,这样可以避免运算时的混淆

*p +1   : p指向地址的值然后值再加一,因此 *p+1 = 8

(*p)++  : 由于括号优先级较高,所以结果同 ①

++*p   : 由于 ++ 是右到左的结合性,因此++ 会结合 *p的值,

因此 ++*p = 8

*p++    : 由于 * 是右到左的结合性,因此会结合p, ++ 也是右到左的结合性,但是 ++ 右边无操作数,因此会结合 p,又由于 ++ 作为了后缀操作符,因此会在对 p 进行过取值运算后在自增,指向另一块地址。

*++p    : 由于 ++ 是右到左的结合性,因此++ 会结合 p的值,对 p 进行自增,使 p 指向了另一块地址空间,然后 * 运算符对另一块地址取值。当然这已经属于对内存的非法操作了,是否报错依据各自的编译器。

5.2指针与函数参数

  • C 语言是以传值的方式将参数传递给被调函数。因此,被调函数不能直接修改传入的变量的值。
  • C 语言中通过 运算符 & 可以将变量的地址的作为一个值传给被调函数,函数中可以通过运算符 * 对变量取值或者修改。

5.3指针与数组

  • 数组名是数组首元素的地址。
  •  通过数组下标所能完成的任何操作都可以通过指针来实现。
  •  如果 p 是一个指向数组中某个元素的指针,那么 p++ 将对 p进行自增运算并指向下一个元素,而 p+i 将对p 进行加 i 的增量运算,使其指向指针p 当前所指向的元素之后的第 i 个元素。

5.4地址算术运算

  •  指针有意义的初始化只能是0 或者是表示地址的表达式,对后者来说,表达式所代表的地址必须是在此前已经定义的具有适当类型的数据的地址。
  • 指针与整数之间不能相互转换,但是 0 是唯一的例外:常量 0 可以复制给指针,指针也可以和常量 0 进行比较,程序中经常使用符号常量 NULL 代替常量 0 ,这样更便于清晰地说明 0 是指针的一个特殊值。
  •  无论指针 p 指向的对象是何种类型,p + n 表示指针 p 当前指向的对象的第 n 个对象的地址。
  • 有效的指针运算包括相同类型指针之间的赋值预算;指针同整数之间的加法或者减法运算;指向相同数组中元素的两个指针间的减法或者比较运算;将指针赋值为 0 或者 指针 与 0 之间的比较运算。

5.5字符指针与函数

char * p = “ now is the time”

  •  上述声明中 p 是一个指针,其初值指向一个字符串常量,之后可以修改指针的值以指向其它地址,但是试图修改字符串的内容,结果是没有定义的。
  • 标准库中 strcmpstrcpy 等函数均使用到字符指针。

5.6字符数组与指针的指针

指针数组: char * pArr[10]; 

  •  pArr 是一个指针数组,每个数组元素都是一个字符指针。

5.7多维数组

C 语言中,二维数组实际上是一种特殊的一维数组,每一元素都是其实都是一个一维数组。

5.8指针数组的初始化

char * pArr[] =

{

“i am a programer” ,

“you ?” ,

“ i gass ...”

};


  •  pArr是一个数组,数组的每个元素都是一个char* 的指针。

5.9指针与多维数组

Int  a[10][20];

Int  *b[10];

 

  •   a 来说分配了200 int 类型的存储空间。
  • b 来说,只是分配了 10 int类型的指针,并且没有对他们初始化,假如 b 的每个元素都指向一个具有 20 个元素的数组,那么编译器就要为它分配 200 int 类型长度的存储空间。
  •  指针数组的优点是数组的每一行长度可以不同,也就是说,b 的每个元素不必都指向一个具有 20 个元素的向量,某些元素可以指向具有 2 个元素的向量,某些元素可以指向具有50 个元素的向量,而某些元素可以不指向任何向量。
  •  指针数组最频繁的用处是存放具有不同长度的字符串。

5.10指命令行参数

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

 

  •  argc:表示运行程序时命令行中参数的数目
  •  argv:指向字符串数目的指针
  •  argc 的值至少是 1
  •  argv[0] 是启动程序的程序名,依次是 argv[1]argv[2] ...
  • ANSI 标准规定argv[argc] 的值必须是一空指针

 

5.11指向函数的指针

Int (*cmp) (void*, void*)

cmp是一个指向函数的指针,该函数有两个void* 类型参数,器返回值为 int

5.12 复杂声明

  •  指针函数: int *f intint),f 是一个函数,函数的返回值是int *
  •  函数指针: int *pf)(intint),pf 是一个指针,指针指向函数入口地址,该函数拥有两个int 类型的参数,返回值是 int

解释与思考5.12

介绍一下书中的两个复杂声明:

 

char * *x()[]  () 

  •  X 是一个函数,它返回一个指针,指针指向一个一维数组,该数组的每个元素为指针类型,这些指针分别指向多个函数,这些函数的返回值为char类型

 

char **x[3]()[5]

  •  x 是一个有 3 个成员数组,数组的每个元素都是一个指针,该指针都指向一个函数,每个函数的返回值也是一个指针,函数返回值的指针指向一个一维数组,数组是由五个char 类型字符组成。

 

你可能感兴趣的:(C语言)