c语言中指针(地址)加法与减法

在c语言中:
unsigned char *p;
p++;//表示p指向的地址增加1

unsigned int *p;
p++;//表示p指向的地址增加4

 

struct student
 {
     unsigned char gender;
     unsigned int id;
     unsigned int age;
     unsigned char name[21]; 
     unsigned int weight;
};

sizeof(struct student) = 40;//按4字节对齐

struct student *p;
p++;//表示p指向的地址增加40

在c语言标准中,加法与减法运算对于地址的操作和对于值的操作是不同的。

当一个加法运算,加号左边的操作数一个是指针,右边是一个整数时,这个整数值先乘以指针指向的数据类型的大小(如sizeof(int)),然后再和指针的值相加。

当一个减法运算,减号左边的操作数是一个指针,右边是一个整数时,这个整数值先乘以指针指向的数据类型的大小(如sizeof(int)),然后再被指针的值减去。

当一个减法运算,减号两边的操作数都是地址时,则这两个地址的数据类型必须一致(如都是int *类型),否则无法通过编译。减法运算的结果为地址值的差,再除以该地址的数据类型的大小(如sizeof(int))。

示例:

#include <stdio.h>
 
 struct student
 {
     unsigned char gender;
     unsigned int id;
     unsigned int age;
     unsigned char name[21]; 
     unsigned int weight;
};

unsigned char arr_char[20];
unsigned int arr_int[20];
 
struct student stu;
struct student stu2[7];

 void main()
 {
    unsigned char *p_char = arr_char;
    unsigned int *p_int = arr_int;
    unsigned int addr = 0;

    printf("p_char = %p\n", p_char);
    printf("p_char + 1 = %p\n", p_char + 1);
    printf("p_int = %p\n", p_int);
    printf("p_int + 1 = %p\n", p_int + 1);
    printf("\n");

    printf("sizeof(stu) = %#x\n", sizeof(struct student));
    printf("stu = %p\n", &stu);
    printf("stu + 1 = %p\n", &stu + 1);
    printf("\n");

    printf("gender_addr = %p\n", &stu.gender);
    printf("id_addr = %p\n", &stu.id);
    printf("age_addr = %p\n", &stu.age);
    printf("name_addr = %p\n", &stu.name);
    printf("weight_addr = %p\n", &stu.weight);
    printf("\n");

    addr = (unsigned int)&stu;
    printf("addr = %#x\n", addr);
    printf("addr + 1 = %#x\n", addr + 1);
    printf("\n");

    p_char = (unsigned char *)&stu;
    printf("p_char = %p\n", p_char);
    printf("p_char + 1 = %p\n", p_char + 1);
    printf("\n");

    printf("stu2 - stu1 = %#x\n", &stu2[7] - &stu2[2]);
    printf("stu2 - stu1 = %#x\n", &arr_int[5] - &arr_int[2]);
 }

运行结果

p_char = 0x804a068
p_char + 1 = 0x804a069
p_int = 0x804a1a0
p_int + 1 = 0x804a1a4

sizeof(stu) = 0x28
stu = 0x804a040
stu + 1 = 0x804a068

gender_addr = 0x804a040
id_addr = 0x804a044
age_addr = 0x804a048
name_addr = 0x804a04c
weight_addr = 0x804a064

addr = 0x804a040
addr + 1 = 0x804a041

p_char = 0x804a040
p_char + 1 = 0x804a041

stu2 - stu1 = 0x5
stu2 - stu1 = 0x3

posted @ 2020-05-01 11:23  hifish  阅读(212)  评论(0)    收藏  举报