C语言初步学习笔记——第十节 指针初步(一)

指针与指针类型

指针就是变量,存放内存单元的地址(类似编号)

对应到代码:

#include<stdio.h>
{
int a = 10;//在内存中申请一块空间
int* p = &a;//取出变量a的地址
//将a的地址cunfangzaip变量中,p就是一个指针变量
return 0;
}

指针的大小——指针占4bit(32位),8bit(64位)

#include<stdio.h>
{
printf("%d\n",sizeof(char*));
printf("%d\n",sizeof(int*));
printf("%d\n",sizeof(short*));
printf("%d\n",sizeof(double*));//以上结果都为4
//那么,既然都可以存放指针的4字节地址,为什么还要区分不同的指针类型呢
int a = 0x11223344;
int* pa = &a;
char* pc = &a;
printf("%p\n",pa);
printf("%p\n",pc);//二者输出结果相同
return 0;

}

 

 但是,指针类型决定了指针进行解引用的时候,能访问的空间的大小

如上图,char*引用的就是a(00010001 00100010 00110011 01000100)

的最后一个字节

以此类推,int*引用4bit,double*引用8bit

与此相同的是:指针的步长

例如:

1)

#include<stdio.h>
int main()
{
int a=0x11223344;
int* pa = &a;
char* pc = &a;
printf("%p\n",pa);
printf("%p\n",pa+1);//地址+4
printf("%p\n",pc);
printf("%p\n",pc+1);//地址+1
return 0;
}

2)指针赋值问题

#include<stdio.h>
int main()
{
int arr[10]={0};
int* p = arr;
int i = 0;
for (i = 0;i < 10; i++)
    {
        *(p + i) = 1;
    }
return 0;
}

上面的代码可以将整型数组中的元素全部改为1;但是下面的代码则只能将前两个改为01010101,第三个改为01010000,其他的全部为00000000(因为指针类型不同,访问或改变的空间也就不同)

#include<stdio.h>
int main()
{
int arr[10]={0};
char* p = arr;
int i = 0;
for (i = 0;i < 10; i++)
    {
        *(p + i) = 1;
    }
return 0;
}

野指针——悬空指针

生成原因——

指针未初始化

#include<stdio.h>
int main()
{
//int a;//局部变量不初始化,默认是随机值
int* pa ;//局部指针变量,就被初始化随机值
*p = 20;//这一步的效果:随机选择内存中的一个空间,将20赋值
	return 0;
}

 指针越界访问

#include<stdio.h>
int main()
{
int arr[10]={0};
int* p=arr;
int i = 0;
for (i = 0;i<= 11; i++)
{
//当指针指向的范围超出所指向数组arr的范围时,p就是野指针
*(p++) = i;
}
	return 0;
}

指针指向的空间释放

#include<stdio.h>
int* test()
{
int a = 10;
return &a;
}
int main()
{
int *p = test();
*p = 20;
	return 0;
}

指针所指向的内存部分已经被释放了,指针已经被悬空了

野指针的规避

指针指向指向空间释放即将该指针指向NULL

而当指针指向NULL,不再可以将除去0之外的值赋给该指针

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值