指针的运算

    其实,在C语言中,指针功能的强大,主要体现在指针变量的间接运算上,指针涉及的运算并不多。

    1、基本运算

    指针变量的基本运算包括赋值、取地址以及取值(间接运算)等运算。

    举例,如清单1: 

#include <stdio.h>

int main(void)
{
    int a = 5;
    int *p = &a;

    int b = *p;
    *p = 9;

    printf("p = %p, &a = %p, &p = %p\n", p, &a, &p);
    printf("a = %d, b = %d\n", a, b);

    return 0;
}

    例子输出结果: 

p = 0xbfee8388, &a = 0xbfee8388, &p = 0xbfee8384
a = 9, b = 5

    第6行的意思是把整型变量a的地址赋给指针变量p(这时可以说p指向了a),然后使用间接运算符(*),像第8和第9行那样,通过p来间接地使用a。

    第5行的语句再平常不过了,其实是有深意的,在大多数编程语言中用同一符号(如变量名a)来表示它的地址和地址中的内容(即值),编译器根据上下文环境来判断它的具体含义。如例子中的第8行的意思是把变量a的值(即整数5)赋给b(在这种情况下a被叫做右值),而第9行的意思是往a的地址(即0xbfee8388)中存储一个整数9(在这种情况下a被叫作左值),所以变量既可作为左值,也可作为右值。

    指针变量作为一种变量,当然既可以给它赋值(如例子中把变量a的地址赋给指针变量p),也可以通过取址运算符(&)来取它的地址(如第11行打印出指针变量p的地址值0xbfee8384)。

    取值运算的复杂用法,如清单2: 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void func(char **p, int num)
{
    *p = (char *)malloc(num);
}

int main(void)
{
    char *str = NULL;

    func(&str, 20);

    strcpy(str, "hello world!");

    printf("%s\n", str);

    free(str);

    return 0;
}

    例子输出结果: 

hello world!

    在例子中的第14行,通过函数调用把指针变量str的地址赋给二级指针变量p,然后在第7行通过*p来间接地使用str,这时str中的值为所分配的20个字节内存的首地址,接着往这段内存中拷贝字符串,最后打印字符串并释放这段内存。

    2、加减和求差

    指针变量加1的意义与整型变量加1的意义不同。

    举例,如清单3: 

#include <stdio.h>

int main(void)
{
    int a[] = {18, 17, 16, 15, 14, 13, 12, 11};

    int *start = a, *end = &a[7];

    printf("address start = %p, end = %p\n", start, end);

    printf("*(start+2) = %d, *(--end) = %d\n",
	    *(start+2), *(--end));

    printf("(--end) - (start+2) = %d\n", (--end) - (start+2));

    return 0;
}

    例子输出结果: 

address start = 0xbfeabab8, end = 0xbfeabad4
*(start+2) = 16, *(--end) = 12
(--end) - (start+2) = 3

    首先使用指针变量start和end分别指向数组a的第一个元素和最后一个元素,然后从start+2(即0xbfeabac0,通过式子0xbfeabab8+2*sizeof(int)算出)的地址中取得整数16,和--end(即0xbfeabad0,通过式子0xbfeabad4-1*sizeof(int)算出)的地址中取得整数12,从中可知,指针变量加1是加一个数据类型(就是声明指针变量时所使用的数据类型)的大小。

    指针变量求差的意义不大,可以得到数组两个元素之间的距离,如例子中元素7和元素3相隔3个元素。

    3、比较

    指针变量的比较就是比较指针变量值的大小以及是否相等,与其他数据类型的比较类似。

    如清单4: 

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char *p = (char *)malloc(10);

    if (p == NULL)
	printf("failed to allocate memory.\n");
    else
	printf("allocate memory successfully.\n");

    free(p);

    return 0;
}

    例子输出结果:

allocate memory successfully.

    例子中,若malloc的返回值不为NULL即表示内存分配成功。

  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
C语言中的指针是一种特殊的变量类型,用于存储内存地址。指针变量存储的是某个对象的内存地址,而不是对象本身的值。 指针运算是对指针进行操作的过程。C语言中提供了一些基本的指针运算符,包括: 1. 取址运算符(&):用于获取变量的地址。例如,`int a = 10; int *p = &a;`中的`&a`表示变量`a`的地址。 2. 解引用运算符(*):用于获取指针变量所指向的对象的值。例如,`int a = 10; int *p = &a; printf("%d", *p);`中的`*p`表示指针变量`p`所指向的对象的值,即输出为`10`。 3. 指针加法运算:可以对指针进行加法运算。例如,`int a[5] = {1, 2, 3, 4, 5}; int *p = a; p = p + 2;`中的`p + 2`表示将指针变量`p`向后移动两个元素,即指向数组`a`的第三个元素。 4. 指针减法运算:可以对指针进行减法运算。例如,`int a[5] = {1, 2, 3, 4, 5}; int *p = &a[4]; p = p - 2;`中的`p - 2`表示将指针变量`p`向前移动两个元素,即指向数组`a`的倒数第三个元素。 5. 指针与整数的加法和减法运算:可以将整数与指针进行加法或减法运算。例如,`int a[5] = {1, 2, 3, 4, 5}; int *p = a; p = p + 2; p = p - 1;`中的`p + 2`表示将指针变量`p`向后移动两个元素,然后再减去一个元素,即指向数组`a`的第二个元素。 需要注意的是,指针运算要遵循一些规则和限制,以防止出现不可预料的错误。例如,对空指针进行解引用或越界访问数组等操作都是不安全的。在使用指针运算时,应该确保指针指向有效的内存地址,并且不越界访问数组。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tanglinux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值