指针和指针偏移:
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; 指针值和指针指向的值都不能修改