指针数组怎么使用
在C语言和C++等语言中,数组元素全为同一类指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组比较适合用来指向若干个字符串,使字符串处理更加方便、灵活。一维指针数组的定义形式为:“类型名 *数组标识符[数组长度]”。
指针与数组
数组名所代表的就是该数组最开始的一个元素的地址,在计算数组元素a[i]的值时,C语言实际上线将其转换为 (a+i)的形式,然后再进行求值。他们是等价的,可以将指针后面加下标,比如pa[i]和 (pa+i)是等价的,但是指针比单纯的数组名要快一些。
有一点很重要的,数组名和指针之间有一个不同之处,指针是一个变量,因此,pa+a和pa++都his合法的,但数组名不是变量(类似一个宏定义?用数组名替换地址?),所以进行对自身的增减运算是非法的。
有时如果将数组名传递给函数,函数可以根据情况判定是按照数组处理还是按照指针处理,随后根据相应的方式操作该函数,为了更直观的表示数组名和指针,可以同时使用两种表示方法。
也可以将数组的一部分传递给函数,不必须从起始位置运算、对于函数来说,它并不关心所引用的是否是一个大数组的其中一部分。
地址算数运算
*allocp = allocbuf起始是存储空间的起始位置。
之后的函数中allocbuf + ALLOCSIZE是存储空间的最后的地址,因为存储空间不一定是从0开始,所以起始地址加上总大小得到的就是这个存储空间最后的地址。减去allocp是将已分配的空间减去,得到的必然是小于或等于空间大小的数,这个数就是剩余的空间的大小。
这就比如从30000开始之后10000的部分是存储空间,已分配空间在35000那么30000加10000减去35000就是剩余的空间了。
之后的那个allocp自增让我懵了一下。自增之后为啥又减了,仔细看发现。allocp += n确实是自增了,本身的地址也改变了。但是allocp - n只是将数值传回了,并没有对自己赋值。
这个函数确实不完善,afree函数很简单就是确定参数的地址是否在存储空间内。是的话就将已分配的地址变成新的地址。
指针也可以初始化,对指针有意义的初始化只能是0或者是表示地址的表达式,表达式代表的地址必须是已经定义的具有适当类型的数据的地址。
static char *allocp = allocbuf;
allocbuf需要在之前已经定义为字符数组才是有意义的。
C语言保证0永远不是有效的数据地址。因此,返回值0可用来表示发生了异常事件。
指针与整数之间不能相互转换,但0是唯一的例外,常熟0可以赋值给指针,指针也可以和常量0进行比较。程序中通常用符号常量NULL代替常量0。符号常量0定义在标准头文件stddef.h中。
在某些情况下对指针可以进行比较运算。如果指针p和q是同一个数组的成员,那么他们之间就可以进行类似于==、!=、,=的关系比较运算。任何指针与0进行相等或不等的比较运算都有意义。但是指向不同数组的元素的指针之间的算数或比较运算没有定义,(这里有一个特例。指针的算数运算中可使用数组最后一个元素的下一个元素的地址。)
指针可以和整数进行相加或相减运算。无论指针对象是何种类型都成立,相加的整数会根据指针指向的类型长度按比例缩放,
指针相减也是有意义的,同数组中的指针相减会得到指针之间字符的数量。
指针的算数运算具有一致性,所有的指针运算都会自动考虑它所指向的对象的长度。
有效的指针运算包括相同类型指针之间的赋值运算;指针同整数之间的加法或减法运算;指向相同数组中元素的两个指针间的减法或比较运算;将指针赋值为0或指针与0之间的比较运算。除此之外其他所有的指针运算都是非法的。(两个指针之一是void *类型的情况除外)
指针数组和数组指针的区别有哪些?
指针数组和数组指针的区别主要有以下几点:
1、数组名不可以改变,而指向数组的指针是可以改变的。字符串指针指向的字符串中的字符是不能改变的,而字符数组中的字符是可以改变的。求数组长度时,借用数组名可求得数组长度,而借用指针却得不到数组长度。
2、数组名的指向不可以改变,而指向数组的指针是可以改变的。因为数组名的指向是不可以改变的,使用自增运算符自增就会改变其指向,这是不对的,数组名只能指向数组的开头。
3、指针数组是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。数组指针是一个指针,它指向一个数组。在32位系统下永远是占4个字节,至于它指向的数组占多少字节。
4、字符串指针指向的字符串中的字符是不能改变的,而字符数组中的字符是可以改变的。指针数组本身就是个数组,只不过呢,它里面存放的数据类型不是int,也不是char这类基本类型,而是一个指针类型,说白了就是地址。
扩展资料:
对于指针数组,首先,它是一个数组,知道数组的元素是一个指针,换句话说,数组存储一个指针。此外,数组本身的字节数由数组本身决定;
数组指针,首先它是一个指针,数组指针的指针数组,也就是说,它是一个指针指向一个数组,唯一可以确定的是它是4个字节在32位系统中,但多少字节是指向一个数组,这不是确定的,它取决于情况。
指针数组和数组指针的区别
1、性质不同
指针数组:首先它是一个数组,数组的元素都是指针,它是“储存指针的数组”的简称。数组指针:首先它是一个指针,它指向一个数组,它是“指向数组的指针”的简称。
2、字节不同
数组占多少个字节由数组本身的大小决定,每一个元素都是一个指针,在32位系统下任何类型的指针永远是占4个字节。
数组指针在32位系统下任何类型的指针永远是占4个字节,至于它指向的数组占多少字节,不知道,具体要看数组大小。
3、表示方法不同
指针数组:数组a中的元素都为int型指针;数组指针:指向数组a的指针。
4、变量不同
指针数组:指针数组可以说成是”指针的数组”,这个变量是一个数组。
数组指针:数组指针可以说成是”数组的指针”,这个变量是一个指针。
指针数组和指针是一样的吗?
正确的。
数组指针是指向数组地址的指针,其本质为指针;指针数组是数组元素为指针的数组(例如 int *p[4],定义了p[0],p[1],p[2],p[3]三个指针),其本质为数组。数组指针的使用在某些情况下与指针数组很相似,要注意区别。
p是一个指针变量,它指向包含4个int元素的一维数组,此时p的增量以它所指向的一维数组长度为单位。
*(p+i)是一维数组a[i][0]的地址;*(p+2)+3表示a[2][3]地址(***行为0行,***列为0列),*(*(p+2)+3)表示a[2][3]的值。
扩展资料:
对指针进行初始化或赋值只能使用以下四种类型的值:
1. 0 值常量表达式,例如,在编译时可获得 0 值的整型 const对象或字面值常量 0。
2. 类型匹配的对象的地址。
3. 另一对象末的下一地址。
4. 同类型的另一个有效指针。
参考资料:
百度百科-指针数组
关于指针数组和指针数组的使用的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。