C++的基础知识(十三)--指针变量

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

  • char*p = “123456”; //p是一个指针变量存放在临时栈区,”123456”是一个字符串常量存放在常量区,变量p保存的是字符串的地址
  • char*str = (char*)malloc(100); //将分配的100字节的堆区的内存空间的地址赋值给指针变量str
  • 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");
}

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

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

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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章