第六章 指针
文章目录
1.认识一下指针
1.指针 == 地址;访问变量的两种方式:1.变量名 ,2.地址
int a = 10;
类型 变量名 内存地址 值
//这样我们就引出来了,指针
1.变量名能访问
2.通过地址也能访问 & 取地址运算符 * 将地址内的值读出运算符
/*********************************************************************************************/
#include <stdio.h>
int main()
{
int a = 10;
printf("a的数值为%d\n",a);
printf("a的地址为%p\n",&a);
printf("a的数值为%d\n",*(&a));// * 是取值运算符,它可以把地址里面的数据来取出来
//这个就是另外一种通过地址来取出来数值的方式
return 0;
}
1.1指针的类型
int*ptr;//指针的类型是int*
char*ptr;//指针的类型是char*
int**ptr;//指针的类型是int**
int(*ptr)[3];//指针的类型是int(*)[3]
int*(*ptr)[4];//指针的类型是int*(*)[4]
1.2指针指向的类型
int*ptr; //指针所指向的类型是int
char*ptr; //指针所指向的的类型是char
int**ptr; //指针所指向的的类型是int*
int(*ptr)[3]; //指针所指向的的类型是int()[3]
int*(*ptr)[4]; //指针所指向的的类型是int*()[4]
1.在指针的算术运算中,指针所指向的类型有很大的作用。"指针的类型"(即指针本身的类型)和(指针所指向的类型)是两个概念.
2.当你对C 越来越熟悉时,你会发现,把与指针搅和在一起的"类型"这个概念分成"指针的类型"和"指针所指向的类型"两个概念.
3.从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。
1.3指针的值或者说所指向的内存区
指针的值:"指针本身存储的数值",这个值将被编译器当作一个地址,而不是一个一般的数值.在32位程序里,所有类型的指针的值都是一个32 位整数,因为32 位程序里内存地址全都是32 位长。
指针所指向的内存区:从指针的值所代表的那个内存地址开始,长度为 sizeof (指针所指向的类型)的一片内存区。以后,1我们说一个指针的值是XX,1就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个"指针指向了某块内存区域",就相当于说"该指针的值是这块内存区域的首地址。"
指针所"指向的内存区"和"指针所指向的类型"是两个完全不同的概念。
在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。"不进行初始化的指针成为野指针,可能会段错误或者各种错误,谨记"
以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里?"重点注意"
这个图怎么看??? 1.首先这个 3 是被一个变量 i 给存着,他的地址是 2000 2.而下面有一个存放着地址 2000(变量i的地址)的变量i_pointer,而这个变量本身又有一个自身的地址 3020
1.4指针所在的地址
指针本身占了多大的内存?你只要用函数 sizeof (指针的类型)测一下就知道了。
在32 位平台里,指针本身占据了4 个字节的长度。
我的电脑是64位的,指针本身就占据了八个字节。
#include <stdio.h>
int main(){
int *p;
printf("%d",sizeof(p));
return 0;
}
1.5通过故事来理解指针
- 去取快递,提别人给你寄的一百斤葡萄,工作人员递给你一张纸条给你,纸条上写的是葡萄的存放地址,你根据地址找到了葡萄。那么这张纸条就是所谓的指针,为啥工作人员给你字条而不直接给你葡萄,因为就像菜鸟驿站一样,快递太多,太大