指针
在我的理解中,指针是用来存放地址的。指针也有大小,对于不同类型的指针char,short,int,,,double,它们的指针大小都是8个字节,对于64位机器是这样的,而对于32位机器它们的指针大小都为4个字节。我的是64位操作系统:
#include <stdio.h>
int main()
{
printf("%zd\n", sizeof(char*));
printf("%zd\n", sizeof(short*));
printf("%zd\n", sizeof(int*));
printf("%zd\n", sizeof(long*));
printf("%zd\n", sizeof(float*));
printf("%zd\n", sizeof(double*));
return 0;
}
显而易见都是8个字节大小的指针。
#include <stdio.h>
int main()
{
int a = 10;
int* p = &a;
printf("%p\n", p);
return 0;
}
分析以上代码:我们定义并初始化了一个int类型的整型变量a,它的值是10;那么此时内存就会给a分配一个int类型大小的空间用来存放a变量,那么也就是说在内存中有一个内存地址专门来指向a。我们想拿到变量a的地址就要用一个操作符,叫做取地址符&
,通过&a
我们就拿到了a的内存地址,当然我们拿到了a的内存地址就要那个变量把它存起来,所以我们用变量p把它存起来,而p的类型是一个指针*
,而int
表示p所指向的对象的类型是int类型。我们把p的值打印出来:
我们通常用16进制来存储地址。
那我们有了指针变量p如何改变变量a里的值呢,此时我们也要用到一个操作符叫做解引用符*
,*p
就等价于a
,所以我们加入*p = 20;
代码后原来a的值就会被重新赋值为20。
#include <stdio.h>
int main()
{
int a = 10;
int* p = &a;
*p = 20;
printf("%d\n", a);
return 0;
}
const
在定义变量前加const表示该变量是一个伪常量,你不能直接修改例如:
#include <stdio.h>
int main()
{
const int a = 10;
a = 20;
printf("%d\n", a);
return 0;
}
编译不通过。但你可以通过指针来间接去修改它的值:
#include <stdio.h>
int main()
{0
const int a = 10;
int* p = &a;
*p = 20;
printf("%d\n", a);
return 0;
}
对于代码int* p = &a;
,加入的const位置不同那么它的作用也不同,例如const int* p = &a;或int const * p = &a
表示我们不能修改指针变量p所指向的那块内存空间里存的值。而int* const p = %a;
,表示我们不能修改指针变量p存储的内存地址的值
多重指针
#include <stdio.h>
int main()
{
int a = 10;
int* p = &a;
int** pp = &p;
int*** ppp=&pp;
return 0;
}
里面最多有一个三重指针,你每取一次地址就会加一重指针。
#include <stdio.h>
int main()
{
int a = 10;
int* p = &a;
int** pp = &p;
int*** ppp=&pp;
printf("%d\n", ***ppp==a);
printf("%d\n", **pp==a);
printf("%d\n", *p==a);
printf("%d\n",*ppp==&p);
printf("%d\n",*pp==&a);
return 0;
}
printf中的等式两边都是等价的。
指针的加减
#include <stdio.h>
int main()
{
int arr[2] = {0};
int* p1 = &arr[0];
int* p2 = &arr[1];
printf("p2-p1=%zd\n", p2-p1);
return 0;
}
指针减指针的结果是它们之间差的元素个数
而指针加1的结果就要根据指针的类型
#include <stdio.h>
int main()
{
int arr[2] = {0};
int* p1 = &arr[0];
int* p2 = &arr[1];
printf("p1=%p\n", p1);
printf("p1+1=%p\n", p1+1);
return 0;
}
显而易见它们之间差了4个字节也就是一个int类型的大小。而对于char类型加1,它们之间相差为1也就是一个char类型的大小。
#include <stdio.h>
int main()
{
char arr[6] = "hello";
char* p1 = &arr[0];
char* p2 = &arr[1];
printf("p1=%p\n", p1);
printf("p1+1=%p\n", p1+1);
return 0;
}