指针其实就是一个类型他是一个什么类型呢?他适合存储地址的一个类型,变量名加个*就是一个指针啦,(指针是可以一个*或者多个*)
比如说
int* ptr1 = NULL;
char* ptr2 = NULL;
short* ptr3 = NULL;
int** ptr4 = NULL;
char** ptr5 = NULL;
short** ptr6 = NULL;
先来说一下正题指针的特性
在x86架构的大小
在x64架构的大小
以上截图可以证明不管指针是一个*或者多个*在x86的指针占据4字节,在X64架构占8字节,为什么呢? 指针就是地址地址就是指针,指针是用来操作内存的但是呢咱们操作内存是不是得需要一个内存地址然后来操作内存地址的值
x64架构的内存地址
x86的内存地址
咱们可以发现有明显的区别地址长度就是最大的区别这就是为什么x86的指针占4字节x64的指针占8字节
一个*和多个*有什么区别我来给你举个例子吧
char* ptr1 = NULL;
char** ptr2 = NULL;
ptr1++;
ptr2++;
printf("ptr1 %d\n", ptr1);
printf("ptr2 %d\n", ptr2);
x86架构下的运行结果
来告诉一下怎么算出来的吧很简单砍掉一个*再计算什么意思比如说
ptr1是个char*类型占用4字节
ptr2是个char**类型也占用4字节
char是一个字节吧?char*砍掉一个*就是char也就是1字节然后+1就是等于+1,
char**是占用4字节砍掉一个*还是4字节所以+1等于+4
使用指针的一个简单例子
int b = 0; //定义一个变量
char* ptr; //定义一个指针
ptr = (char*)&b; //指针指向b的(地址)
*ptr = 5; //用指针操作b的值
printf("%d\n", b);//打印b的值
运行后你就会发现b的值变成了5
其实数组也是有指针的特性
char str[2][6] = {"hello","World"};
char* ptr = (char*)&str;//ptr指向str字符串
printf("%c\n", str[1][4]); //访问d字符
printf("%c\n", *(*(str+1)+4));//访问d字符
printf("%c\n", ptr[10]); //访问d字符
printf("%c\n", *(ptr+10)); //访问d字符
以上写了一个字符串还有一个指针这是一些操作方法
ptr[10]等同于*(ptr+10)只是简写而已我认为没有什么指针数组啊数组指针啊还是什么指针变量啊,指针就是指针我想怎么指就怎么指(但是指向不存在的内存地址或者无法访问的内存地址会报错的)
执行结果