指针01
zhi
内存
1.堆
- 在动态申请内存的时候,在堆开辟内存
2.栈
- 主要存放局部变量(在函数内部,或复合语句内部定义的变量)
3.静态全局区
-
未初始化的静态全局区
- 静态变量(定义的时候,前面加static修饰),或全局变量
-
初始化的静态全局区
- 全局变量,静态变量,赋过初值的,存放在此区
4.代码区
- 存放咱们的程序代码
5.文字常量区
- 存放常量的
指针变量
指针变量就是用来存放一个地址编号的变量
指针变量的定义
1.简单指针的定义
- 定义方法
数据类型* 指针变量名;
- 野指针,没有指向的指针不知道指向哪里
2.关于指针的运算符
&取地址符、*取值
//定义一个简单的int指针变量
int *p;
//定义一个int型变量并且赋值
int d = 12;
//取d 的地址赋给 p
p = &d;
printf("d的地址为:%p,\nd的值为:%d,\np的地址为:%p,\np的值为:%d",&d,d,p,*p);
/*
d的地址为:0062fec8,
d的值为:12,
p的地址为:0062fec8,
p的值为:12
*/
分析:
1 在调用的时候*代表取值的意思,*p就相当于p指向的变量,即d
2 故num=*p和num=d的效果是一样的
3 所以说num的值为12,地址为0062fec8
3.指针的大小
//测试指针的大小
int* intp;
long* longp;
short* shortp;
float* floatp;
double* doublep;
char* charp;
printf("int指针大小:%d\n",sizeof(intp));
printf("long指针大小:%d\n",sizeof(longp));
printf("short指针大小:%d\n",sizeof(shortp));
printf("floatt指针大小:%d\n",sizeof(floatp));
printf("double指针大小:%d\n",sizeof(doublep));
printf("char指针大小:%d\n",sizeof(charp));
//都是4说明和存地址的大小一致
/*
int指针大小:4
long指针大小:4
short指针大小:4
floatt指针大小:4
double指针大小:4
char指针大小:4
*/
指针和变量的关系
//指针和变量的关系
//程序中引用变量的方法
//1.直接通过变量的名称
int a;
a=10;
//2.可以通过指针变量来引用变量
int *p; //在定义的时候,*不是取值,是修饰这个变量是指针变量
p=&a; //取a的地址给p赋值,p保存了a的地址,也就是说p指向了a
printf("p的地址为%p \n a的地址是 %p \n &a 的地址是 %p \n&p的地址是 %p\n",p,a,&a,&p);
/**
p的地址为0062fecc 这是p指针指向的地址 ,就是a的地址 ,说明指针变量里存的是个地址
a的地址是 0000000a 这是a的值的地址,10用16进制表示就是 a,说明int类型变量里存的也是个地址,指向它存储的值
&a 的地址是 0062fecc 这是内存中变量a的地址,因为用了&
&p的地址是 0062fec8 这个内存中指针变量p的地址,因为用了&
**/
*p = 100; //在调用时*是取值的意思,*地址等价于变量
printf("a 的值为 : %d,%d,%d\n",a,*&a,*&*&*&a); //a 的值为 : 100,100,100 ,说明*是取这个地址的值,&是取地址,了解之后可以出现 *&*&*&a 这种奇怪的东西
//3. 指针++的意思
printf("p 目前的地址是%p:\n",p); //p 目前的地址是0062fecc:
p++;
printf("p++ 后的地址是%p:\n",p); //p++ 后的地址是0062fed0: 0xcc + 0x04 = 0xd0 说明刚好跳了4个字节
printf("p++:%d",*p); //p++:54 不知道是哪个数
char ch = 'c';
char *c = &ch;
printf("c 目前的地址是是%p:\n",c); //c 目前的地址是是0062fec3:
c++;
printf("c++ 后的地址是%p:\n",c); //c++ 后的地址是0062fec4: 说明char只会跳1 个字节 ,说明指针++会根据指针的类型来确定跳过多少个地址
指针和数组的关系
- 如何用指针代替数组去操作
int main(){
// 指针变量可以指向一个数组,而C语言规定,数组名是个常量指向数组的首地址,数组从0开始
int *p;
int arr[5];
//1. 可以用数组名[下标引用]
arr[1] = 2;
p = arr;
// 2. 也能用 指针名[下标引用]
p[2] = 5;
//3. 可以指针++赋值
*(p+3) = 6;
//4 . 数组名++ 赋值
*(arr+4) = 66;
printf("P 为 %p , arr 为 %p\n",p,arr); // P 为 0062feb8 , arr 为 0062feb8 ,说明将数组的首地址给指针了
printf("arr[1]:%d,arr[2]:%d\n",arr[1],arr[2]); //arr[1]:2,arr[2]:5 ,说明指针和数组调用的都是同一个
printf("arr[3]:%d\n",arr[3]); //arr[3]:6
printf("arr[4]:%d\n",arr[4]); //arr[4]:66
return 0;
}