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

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


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指向的是堆区的内存空间,字符串从常量区拷贝到堆区




  



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


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指向的是堆区的内存空间,字符串从常量区拷贝到堆区




  



猜你喜欢

转载自blog.csdn.net/cyb519/article/details/78178446