c语言基础--数组和指针---字符串
数组的形式是int a[];
int b;b是一个标量,a就是一个数组,因为它是一些值的集合。下标和数组名一起使用,用于标识集合中某个特定的值,每一个特定的值都是一个标量
可以用于任何可以使用表量的环境中,a[1]标识一个标量一个整数,那么a是什么呢?一个合乎逻辑的答案是他代表整个数组。但事实并非如此,在c中,在
几乎所有使用数组名得表达式中,数组名得值是一个指针常量,也就是数组第一个元素的位置。它的类型取决于数组元素的类型;如果他们是int型那么他们就是
指向int的常量指针。但请不要根据这个事实得出数组和指针是相同的结论。数组具有一些和指针完全不同的特性,例如数组具有特定的大小而指针只是个标量值。
编译器用数组名来记住这些属性。只有当数组名在表达式中使用时编译器才会为他产生一个指针常量。注意这个值是一个常量而不是一个指针变量,你不能修改它
的值。
指针常量所指向的是内存中数组的起始位置,如果修改这个指针常量,唯一可行的办法是把整个数组移到内存中的其他位置。但是程序完成链接以后,内存中各
数组的位置是固定的,所以当程序运行时再想移动数组就已经晚了。因此,数组名得指针是一个常量。
只有在两种场合之下,数组名并不用指针常量来表示---就是当数组名作为sizeof操作符或单日操作符&的操作时。sizeof返回整个数组的长度,而不是指向
数组的指针的长度。取一个数组名地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量的指针。
下表引用
*(b+3)首先b是一个指向整型的指针,所以3这个值根据整型值的长度进行调整。加法运算的结果是另一个指向整型的指针。它所指向的是数组第一个元素
向后移动3个整型长度的位置。然后间接访问操作访问这个新位置。或者取得一个值或者把一个新值存于此处。
除了优先级以后下标引用和间接访问完全相同。
arry[a] and *(arry + a)是等价的
指针也可以有下标,它取决于当前所指向的位置和数组的下标
数组和指针
函数的参数都是通过传值方式进行的,但数组名参数的行为却仿佛它是通过传址调用传递的。传址调用是通过传递一个指向所需元素的指针,然后再函数中对
该指针执行间接访问操作实现对数据的访问。作为参数的数组名是个指针,下标引用实际上执行的是间接访问
声明数组参数
指针数组
int *a[10]
下标的优先级高于间接访问的优先级
==================================
字符串、字符和字节
==================================
所有其他的字符串都存在数组里或是动态分配的内存里。
字符串\0结束,字符串的长度不包括\0的长度。头文件string.hA包含所有的字符串函数的原型和声明
字符串长度
字符串的长度就是他所包含的字符的个数
int b;b是一个标量,a就是一个数组,因为它是一些值的集合。下标和数组名一起使用,用于标识集合中某个特定的值,每一个特定的值都是一个标量
可以用于任何可以使用表量的环境中,a[1]标识一个标量一个整数,那么a是什么呢?一个合乎逻辑的答案是他代表整个数组。但事实并非如此,在c中,在
几乎所有使用数组名得表达式中,数组名得值是一个指针常量,也就是数组第一个元素的位置。它的类型取决于数组元素的类型;如果他们是int型那么他们就是
指向int的常量指针。但请不要根据这个事实得出数组和指针是相同的结论。数组具有一些和指针完全不同的特性,例如数组具有特定的大小而指针只是个标量值。
编译器用数组名来记住这些属性。只有当数组名在表达式中使用时编译器才会为他产生一个指针常量。注意这个值是一个常量而不是一个指针变量,你不能修改它
的值。
指针常量所指向的是内存中数组的起始位置,如果修改这个指针常量,唯一可行的办法是把整个数组移到内存中的其他位置。但是程序完成链接以后,内存中各
数组的位置是固定的,所以当程序运行时再想移动数组就已经晚了。因此,数组名得指针是一个常量。
只有在两种场合之下,数组名并不用指针常量来表示---就是当数组名作为sizeof操作符或单日操作符&的操作时。sizeof返回整个数组的长度,而不是指向
数组的指针的长度。取一个数组名地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量的指针。
下表引用
*(b+3)首先b是一个指向整型的指针,所以3这个值根据整型值的长度进行调整。加法运算的结果是另一个指向整型的指针。它所指向的是数组第一个元素
向后移动3个整型长度的位置。然后间接访问操作访问这个新位置。或者取得一个值或者把一个新值存于此处。
除了优先级以后下标引用和间接访问完全相同。
arry[a] and *(arry + a)是等价的
指针也可以有下标,它取决于当前所指向的位置和数组的下标
数组和指针
函数的参数都是通过传值方式进行的,但数组名参数的行为却仿佛它是通过传址调用传递的。传址调用是通过传递一个指向所需元素的指针,然后再函数中对
该指针执行间接访问操作实现对数据的访问。作为参数的数组名是个指针,下标引用实际上执行的是间接访问
声明数组参数
指针数组
int *a[10]
下标的优先级高于间接访问的优先级
==================================
字符串、字符和字节
==================================
所有其他的字符串都存在数组里或是动态分配的内存里。
字符串\0结束,字符串的长度不包括\0的长度。头文件string.hA包含所有的字符串函数的原型和声明
字符串长度
字符串的长度就是他所包含的字符的个数