指针、指针变量与内存空间——解惑

简介:

指针、指针变量与内存空间——解惑

 

 

 

       一年前,我曾今在ChinaUnix写过一篇博客《关于定义一个指针与指针变量》然后搬家来了CSDN。这篇博客中写道了很多关于指针和指针变量以及空间分配的一些常见错误。但是,到现在为止,无论是CSDN的网友还是一些已经工作的同事以及大三大四的学生,陆陆续续的有人在问我关于指针与指针变量还有空间分配问题。我想在这里再写一篇博客解惑指针

 

 

问题1

int idata = 5; int *p = idata//为什么这里不对?

既然通常*p表示对指针p指向数据的引用,为什么*p = idata不能行呢?

 

回答:int *p和引用时的*p概念是不一样的。定义数据的时候 int *p所表示的是定义了一个指向int数据的指针p。并不是数据引用时的*p.

所以,int *p只是定义了一个指向int数据的指针p,这个指针p所存放的是一个地址(32位),而idata是一个int数据,int数据不能赋值给一个地址。除了定义以外的其他地方,*p所表示就是p所指向的数据。

所以以上语句作出以下更改就对了:

int idata = 5; int *p = &idata;//p存放idata的地址

 

 

 

问题2:

既然问题1中已经说了,定义是只是定义了一个指针p,下面的语句为什么是对的呢?

char *p = "hello world";//为什么是对的?

 

回答:

C语言中,字符字符串常量是按字符串数组来处理的,会在内存中开辟一个字符串数组用来存放该字符串常量,然后把该字符串数字的首元素地址赋值给p。

以上语句其实等价于下面:

char *p = "hello world"; //等价于 char tmp[] = "hello world"; char *p = tmp; //等价于 char tmp[] = "hello world"; char *p = NULL;//初始化,避免编译错误 p = tmp;

 

 

问题3:

对于结构体指针,struct mystruct *pstruct,然后对pstruct进行操作,为什么有时候正确,有时候又报内存错误?

 

 

回答:

指针的操作分为输入与输出。所谓输入:即将指向结构体的指针pstruct穿进去给别人处理。输出:即别的函数需要输出,需要写的。

你所谓的有时候正确有时候又不正确,其实是因为你没有搞清楚究竟该谁分配空间。一定要铭记:定义一个指针只是定义了一个存放地址的指针变量,他只能存放地址,定义一个指针并没有为他所指向的数据分配空间。例如 struct mystruct *p,定义了一个指向struct mystruct的指针变量p,并没有分配struct mystruct大小的数据空间。如果p没有指向任何数据,你对它进行写操作,必定会出内存错误。

但是如果这样做:

 

struct mystruct myst;

struct mystruct *p = &myst;

 

然后再对p进行操作,就不会出错。说到底,还是没有弄清楚程序设计需要谁去为数据分配空间的问题。

 

 

最近在温故《C ++ primer》这本书,其中有一句话非常经典:

When attempting to understand pointer declarations, read them
from right to left.

理解指针定义的时候,应该从右往左读

 

 


 

 

 

版权申明:
转载文章请注明原文出处http://blog.csdn.net/feiyinzilgd/archive/2011/01/05/6119090.aspx

并请联系谭海燕本人或者前往谭海燕个人主页留言

 

目录
相关文章
|
5月前
|
存储 C语言
指针和动态内存分配
指针和动态内存分配
107 0
|
2月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
146 13
|
2月前
|
存储 C语言 开发者
C 语言指针与内存管理
C语言中的指针与内存管理是编程的核心概念。指针用于存储变量的内存地址,实现数据的间接访问和操作;内存管理涉及动态分配(如malloc、free函数)和释放内存,确保程序高效运行并避免内存泄漏。掌握这两者对于编写高质量的C语言程序至关重要。
62 11
|
2月前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
2月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
2月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
2月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
870 2
|
3月前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
3月前
魔法指针 之 指针变量
魔法指针 之 指针变量
18 1
|
3月前
|
C++
析构造函数就是为了释放内存,就是在局部指针消失前释放内存,拷贝构造函数就是以构造函数为模块,在堆里面新开一块,同一个变量在堆里面的地址
本文讨论了C++中构造函数和析构函数的作用,特别是它们在管理动态内存分配和释放中的重要性,以及如何正确地实现拷贝构造函数以避免内存泄漏。
45 2