搜索
您的当前位置:首页正文

C语言指针变量的运算

来源:六九路网


指针变量也是可以进行运算的,如指针变量对其自身加上某个整数或减去某个整数,这在内存上体现为:相对这个指针向后偏移多少个单位或向前偏移了多少个单位,这里的单位与指针变量的类型有关。在32bit环境下,int类型占4个字节,float占4字节,double类型占8字节,char占1字节。

【注意】一些处理整数的操作不能用来处理指针。例如,可以把两个整数相乘,但是不能把两个指针相乘。

2示例程序

运行结果为:

解析:

举例说明pa0→pa1→pa2的过程,其他类似。pa0+2*sizeof(int)=pa1,pa1-1*sizeof(int)=pa2。因为pa为int类型的指针,所以加减运算是以4字节(即sizeof(int))为单位地址向前向后偏移的。看下图:

如图:pa1所指向的地址在pa0所指向地址往后8字节处,pa2指向地址在pa1指向地址往前4字节处。

从本示例程序中,还可以看出:连续定义的变量在内存的存储有可能是紧挨着的,有可能是分散着的。

以上就是关于C语言指针变量运算的一些总结:指针变量与整数相加相减是相对该指针指向的地址向后向前偏移多少个单位。这里的单位不能认为总是1。在32bit环境下,char类型指针的偏移单位才是1字节,int类型指针偏移单位是4字节,float类型指针偏移单位是4字节,double类型指针偏移单位是8字节。

C语言中没有特定的字符串类型,常用以下两种方式定义字符串:一种是字符数组,

另一种是指向字符串的指针。如下:

(1)char str[] = \"happy\";

(2)char *str = \"happy\";

这种方式有什么不同呢?

下面看两个例子:修改字符串中的字符

示例1:

#include

int main(void)

{

char str[20] = \"hello\";

str[0] = 'H';

printf(\"%s\\n\

return 0;

}

运行结果:

Hello

示例2:

#include

int main(void)

{

char *str = \"hello\";

str[0] = 'H';

printf(\"%s\\n\

return 0;

}

运行结果:

无打印信息输出

可见,使用(1)方式定义的字符串其字符是可以修改的,使用(2)方式定义的字符串其字符是不可以修改的。(2)中可以成功编译和链接,但运行时可能会出现错误,我编译与运行的平台是window10平台,运行结果是无打印信息输出,在其他不同的平台运行可能会出现段错误(Segment Fault)或者写入位置错误。

这两种表示字符串的方式的主要区别是:字符串指针指向的内容是不可修改的,字符数组是可以修改的,即(2)方式定义的字符串保存在常量区,是不可更改的,(1)方式定义的字符串保存在全局数据区或栈区,是可修改的。

内存的分配方式:

内存分配可分为三种:静态存储区、栈区、堆区。

1、静态存储区:该内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,它主要存放静态数据、全局数据和常量。

2、栈区:它的用途是完成函数的调用。在执行函数时,函数内局部变量及函数参数的存储单元在栈上创建,函数调用结束时这些存储单元自动被释放。

3、堆区:程序在运行时使用库函数为变量申请内存,在变量使用结束后再调用库函数释放内存。动态内存的生存期是由我们决定的,如果我们不释放内存,就会导致内存泄漏。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top