C语言之指针专题一:指针变量和指针所指向的内存空间是两个不同的概念

本文详细解析了指针的概念、用法及其与内存之间的关系。包括指针的声明、使用、指针变量与内存块的区别、内存模型的建立以及一级指针的常见错误模型与解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指针变量指针所指向的内存空间是两个不同的概念


char*p = "123456";//p是一个指针变量存放在临时栈区,"123456"是一个字符串常量存放在常量区,变量p保存的是字符串的地址

char*str = (char*)malloc(100);//将分配的100字节的堆区的内存空间的地址赋值给指针变量p

strcpy(str,"123456");//将字符串拷贝到堆区


1)指针也是一种变量,占有内存空间,用来保存内存地址

2)*p操作内存
   在指针声明时,*号表示所声明的变量为指针
   在指针使用时,*号表示 操作 指针所指向的内存空间中的值
   *p相当于通过地址(p变量的值)找到一块内存;然后操作内存
   *p放在等号的左边赋值(给内存赋值)
   *p放在等号的右边取值(从内存获取值)
3)指针变量和它指向的内存块是两个不同的概念
   含义1 给p赋值p=0x1111; 只会改变指针变量值,不会改变所指的内容;p = p +1; //p++
   含义2 给*p赋值*p='a'; 不会改变指针变量的值,只会改变所指的内存块的值 
   含义3 =左边*p 表示 给内存赋值, =右边*p 表示取值 含义不同切结!
   含义4 =左边char *p
   含义5 保证所指的内存块能修改
4)指针是一种数据类型,是指它指向的内存空间的数据类型
    含义1:指针步长(p++),根据所致内存空间的数据类型来确定
    p++=(unsigned char )p+sizeof(a);
    结论:指针的步长,根据所指内存空间类型来定。

5)一级指针易错模型:

不断修改指针变量的值,然后又回过头来释放该内存的时候,程序就会出bug

void main()

{

    char*p = (char*)malloc(100);

    strcpy(p,"123456789");

    p = p + 2;//指针指向已经改变

    *p = 'a' ;

    //注意:C语言规定:要释放内存必须从内存首地址开始释放

    free(p)//现在又想释放原来所指向的空间,程序就会报错

}

解决该错误的方法是加一个辅助指针变量pstr用来定位到首地址

void main ()
{
 char*pstr = NULL;
 char*p = NULL;
 p=pstr= (char*)malloc(100);
 strcpy(p, "123456789");
 p = p + 2;//指针指向已经改变
 *p= 'a';
 p = p - 2;
 printf("%s", p);
 free(pstr);//现在又想释放原来所指向的空间,程序就会报错
 p = pstr = NULL;//避免产生野指针
 system("pause");
}


6)一级指针内存模型建立

字符串一级指针内存模型图:

注意:


C语言字符串在堆区、栈区,常量区都可以存放字符串。

1、char buf[20] = "aaaa" 将常量区aaaa拷贝到栈区 

2、buf2[] = "bbbb"也是分配栈区空间和buf是一样的

3、指针p1指向的是常量区的字符串,保存该字符串的地址

4、指针p2指向的是堆区的内存空间,字符串从常量区拷贝到堆区




  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值