指针和指针偏移, 常量指针和指针常量

本文详细解释了C语言中指针的大小与机器位数的关系,展示了不同类型指针的内存占用,以及指针偏移的概念,包括数组指针和常量指针的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指针和指针偏移: 

C语言中的指针的大小和机器的位数相关,32位的机器指针的大小是4个字节,64位的机器指针大小是8个字节,和指针的类型没有关系

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


int main()
{
    char* pc;
    int* pi;
    char ** pcc;
    char arr1[] = "hello";
    char arr2[][5] = {"asdf", "qwer"};
    int arri[] ={12,2,1,4};
    int (*p)[4];
    p = &arri; //&arri是指向数组的指针,不能用arri,arri是数组的首地址

    printf("sizeof(pc) = %ld\n", sizeof(pc));
    printf("sizeof(pi) = %ld\n", sizeof(pi));
    printf("sizeof(pcc) = %ld\n", sizeof(pcc));
    printf("arr1 = %p, sizeof(arr1) = %ld\n", arr1, sizeof(arr1));
    printf("arr1+1 = %p, *(arr1+1) = %c\n", arr1+1, *(arr1+1));
    printf("&arr1 = %p, sizeof(&arr1) = %ld\n", &arr1, sizeof(&arr1));
    printf("&arr1+1 = %p, *(&arr1+1) = %d\n", &arr1+1, *(arr1+1));
    printf("arr2 = %p\n", arr2);
    printf("arr2+1 = %p, *(arr2+1) = %s\n", arr2+1, *(arr2+1));

    printf("p = %p, arri = %p\n", p, arri);
    printf("sizeof(*p) = %ld, p+1 = %p\n", sizeof(*p), p+1);

}

执行结果

数组名arr1和&arr1和值一样,但是表示的结果不一样

arr1是数组名,表示数组的首地址,sizeof(arr1)=6,表示的是数组的长度,加1是加一个数组元素的大小,也就是sizeof(char) 1个字节

&arr1是指向数组的指针,大小是8个字节,可以看做二级指针,加1是加一整个数组的大小,这里是6个字节,指向下一个未知的地方

所以指针变量加1,偏移的长度是其类型的长度,加的是sizeof(基类型)

比如:int *p

p+1 =>p+sizeof(*p)(或p+sizeof(int)),也就是偏移4个字节

比如数组指针:int (*p)[4]; (p是指向含4个int型的数组)

p+1 => p+sizeof(*p) (或p +sizeof(int)*4)=> p+16 

常量指针和指针常量:

 常量指针:

int number = 5;

const int *p1 = &number;

int const *p1 = &number;

这两种是都是常量指针,可以看成const修饰的是*p1,所以p1指向的值不可以修改,指针值可以修改

指针常量:

int* const p2 = &number;

修饰的是int* 类型的p2指针,指针值不能修改,指针指向的值可以修改

const int* const p4 = &number; 指针值和指针指向的值都不能修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值