2024年9月指针是什么意思啊?指针的作用是什么啊
⑴指针是什么意思啊?指针的作用是什么啊
⑵ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了n乘sizeof(ptrold所指向的类型)个字节,ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节,所有类型的指针的值都是一个位整数,指针所指向的内存区就是从指针的值所代表的那个内存地址开始,指针所指向的内存区和指针所指向的类型是两个完全不同的概念,故ptr所指向的地址由原来的变量a的地址向高地址方向增加了个字节,指针ptr的类型是int*,它指向的类型是int,新的ptr指向的地址将比原来的ptr所指向的地址向低地址方向移动了个字节。
⑶意思是一个char指针。
⑷在计算机科学中,指针(Pointer是编程语言中的一个对象,利用地址,它的值直接指向(pointsto存在电脑存储器中另一个地方的值。
⑸由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
⑹大家都认为,c语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是c语言的灵魂,一点都不为过。
⑺同时,这种说法也让很多人产生误解,似乎只有C语言的指针才能算指针。basic不支持指针,在此不论。其实,pascal语言本身也是支持指针的。
⑻从最初的pascal发展至今的objectpascal,可以说在指针运用上,丝毫不会逊色于c语言的指针。
⑼计算机中的内存都是编址的,就像你家的地址一样。在程序编译或者运行的时候,系统(可以不关心具体是什么,可能是编译器,也可能是操作系统开辟了一张表。
⑽每遇到一次声明语句(包括函数的传入参数的声明都会开辟一个内存空间,并在表中增加一行纪录。
⑾第一,指针的使用使得不同区域的代码可以轻易的共享内存数据。当然小伙伴们也可以通过数据的复制达到相同的效果,但是这样往往效率不太好。因为诸如结构体等大型数据,占用的字节数多,复制很消耗性能。
⑿但使用指针就可以很好的避免这个问题,因为任何类型的指针占用的字节数都是一样的(根据平台不同,有字节或者字节或者其他可能。
⒀第二,指针使得一些复杂的链接性的数据结构的构建成为可能,比如链表,链式二叉树等等。
⒁第三,有些操作必须使用指针。如操作申请的堆内存。还有:C语言中的一切函数调用中,值传递都是“按值传递”的。如果要在函数中修改被传递过来的对象,就必须通过这个对象的指针来完成。
⒂指针的表现形式是地址,核心是指向关系指针运算符“*”的作用是按照指向关系访问所指向的对象.如果存在A指向B的指向关系,则A是B的地址,“*A”表示通过这个指向关系间接访问B。
⒃如果B的值也是一个指针,它指向C,则B是C的地址,“*B”表示间接访问C如果C是整型、实型或者结构体等类型的变量或者是存放这些类型的数据的数组元素,则B(即C的地址)是普通的指针,称为一级指针,用于存放一级指针的变量称为一级指针变量。
⒄指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。分别说明。
⒅先声明几个指针放着做例子:
⒆int(*ptr);
⒇int*(*ptr);
⒈从语法的角度看,只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。看看下面各个指针的类型:
⒉int*ptr;//指针的类型是int*
⒊char*ptr;//指针的类型是char*
⒋int**ptr;//指针的类型是int**
⒌int*(*ptr)
⒍当通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。从语法上看,只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:
⒎int*ptr;//指针所指向的类型是int
⒏char*ptr;//指针所指向的的类型是char
⒐int**ptr;//指针所指向的的类型是int*
⒑int*(*ptr)
⒒在指针的算术运算中,指针所指向的类型有很大的作用。
⒓指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当对C越来越熟悉时,会发现,把与指针搅和在一起的“类型”这个概念分成“指针的类型”和“指针所指向的类型”两个概念,是精通指针的关键点之一。
⒔指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在位程序里,所有类型的指针的值都是一个位整数,因为位程序里内存地址全都是位长。
⒕指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。
⒖指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。
⒗指针本身所占据的内存区
⒘指针本身占了多大的内存;只要用函数sizeof(指针的类型)测一下就知道了。在位平台里,指针本身占据了个字节的长度。
⒙指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。
⒚指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。例如:
⒛int*ptr=a;
在上例中,指针ptr的类型是int*,它指向的类型是int,它被初始化为指向整形变量a。接下来的第句中,指针ptr被加了,
编译器是这样处理的:它把指针ptr的值加上了sizeof(int),在位程序中,是被加上了。由于地址是用字节做单位的,故ptr所指向的地址由原来的变量a的地址向高地址方向增加了个字节。
由于char类型的长度是一个字节,所以,原来ptr是指向数组a的第号单元开始的四个字节,此时指向了数组a中从第号单元开始的四个字节。
可以用一个指针和一个循环来遍历一个数组,看例子:
这个例子将整型数组中各个单元的值加。由于每次循环都将指针ptr加,所以每次循环都能访问数组的下一个单元。再看例子:
int*ptr=a;
在这个例子中,ptr被加上了,编译器是这样处理的:将指针ptr的值加上乘sizeof(int),在位程序中就是加上了乘=。由于地址的单位是字节,故现在的ptr所指向的地址比起加后的ptr所指向的地址来说。
向高地址方向移动了个字节。在这个例子中,没加前的ptr指向数组a的第号单元开始的四个字节,加后,ptr已经指向了数组a的合法范围之外了。虽然这种情况在应用上会出问题,但在语法上却是可以的。这也体现出了指针的灵活性。
如果上例中,ptr是被减去,那么处理过程大同小异,只不过ptr的值是被减去乘sizeof(int),新的ptr指向的地址将比原来的ptr所指向的地址向低地址方向移动了个字节。
总结一下,一个指针ptrold加上一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值增加了n乘sizeof(ptrold所指向的类型)个字节。
就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。一个指针ptrold减去一个整数n后,
结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。
ptrnew的值将比ptrold的值减少了n乘sizeof(ptrold所指向的类型)个字节,就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。