C++中指针入门

什么是指针?

其实指针就像是其它变量一样,所不同的是一般的变量包含的是实际的真实的数据,而指针是一个指示器,它告诉程序在内存的哪块区域可以找到数据。这是一个非常重要的概念,有很多程序和算法都是围绕指针而设计的,如链表。

开始学习

如何定义一个指针呢?就像你定义一个其它变量一样,只不过你要在指针名字前加上一个星号。我们来看一个例子:下面这个程序定义了两个指针,它们都是指向整型数据。

int * pNumberOne;
int * pNumberTwo;

你注意到在两个变量名前的“p”前缀了吗?这是程序员通常在定义指针时的

一个习惯,以提高便程序的阅读性,表示这是个指针。现在让我们来初始化这两个指针:

pNumberOne = &some_number;
pNumberTwo = &some_other_number;

&号读作“什么的地址”,它表示返回的是变量在内存中的地址而不是变量本身的值。在这个例子中,pNumberOne 等于some_number的地址,所以现在pNumberOne指向some_number。 如果现在我们在程序中要用到some_number,我们就可以使用pNumberOne。

我们来学习一个例子:

在这个例子中你将学到很多,如果你对指针的概念一点都不了解,我建议你多看几遍这个例子,指针是个很复杂的东西,但你会很快掌握它的。

这个例子用以增强你对上面所介绍内容的了解。它是用C编写的(注:原英文版是用C写的代码,译者重新用C++改写写了所有代码,并在DEV C++ 和VC++中编译通过!)

#include <iostream.h>

void main()
{
// 声明变量:

int nNumber;
int *pPointer;

// 现在给它们赋值:

nNumber = 15;
pPointer = &nNumber;

//打印出变量nNumber的值:

cout<<"nNumber is equal to :"<< nNumber<<endl;

// 现在通过指针改变nNumber的值:

*pPointer = 25;

//证明nNumber已经被上面的程序改变

//重新打印出nNumber的值:

cout << "nNumber is equal to :" << nNumber << endl;
}

通读一下这个程序,编译并运行它,务必明白它是怎样工作的。如果你完成了,准备好,开始下一小节。

陷井!

试一下,你能找出下面这段程序的错误吗?

#include <iostream.h>

int *pPointer;

void SomeFunction();

{
int nNumber;
nNumber = 25;

//让指针指向nNumber:

pPointer = &nNumber;
}

void main()
{
SomeFunction(); //为pPointer赋值

//为什么这里失败了?为什么没有得到25

cout<<"Value of *pPointer: "<<*pPointer<<endl;
}

这段程序先调用了SomeFunction函数,创建了个叫nNumber的变量,接着让指针pPointer指向了它。可是问题出在哪儿呢?当函数结束后,nNumber被删掉了,

因为这一个局部变量。局部变量在定义它的函数执行完后都会被系统自动删掉。也就是说当SomeFunction 函数返回主函数main()时,这个变量已经被删掉,但pPointer还指着变量曾经用过的但现在已不属于这个程序的区域。如果你还不明白,你可以再读读这个程序,注意它的局部变量和全局变量,这些概念都非常重要。

但这个问题怎么解决呢?答案是动态分配技术。注意这在C和C++中是不同的。由于大多数程序员都是用C++,所以我用到的是C++中常用的称谓。

时间: 2024-08-06 14:00:57

C++中指针入门的相关文章

C++系统中指针错误,添加不了对象,真的很急!!!!

问题描述 C++系统中指针错误,添加不了对象,真的很急!!!! 为什么不能实现添加啊!!!!!真的很急 #include <iostream>#include <iomanip>#include <conio.h>#include <string>#include <fstream>#include <cstdlib>using namespace std;int i=0;const int Maxp=100;//最大商品类的数量cl

MFC应用程序中指针的使用

VC中编程对于刚刚开始学习的同学,最大的障碍和问题就是消息机制和指针获取与操作.其实这些内容基本上是每本VC学习工具书上必讲的内容,而且通过MSDN很多问题都能解决. 下面文字主要是个人在编程中指针使用的一些体会,说的不当的地方请指正. 一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针获取和操作问题. 下面这节内容主要是一般的框架,然后再讲多线程中的指针使用.使用到的类需要包含响应的头文件.首先一般获得本类(视,文档,

c/c++中指针学习的两个绝好例子

对于众多人提出的c/c++中指针难学的问题做个总结: 指针学习不好关键是概念不清造成的,说的简单点就是书没有认真看,指针的学习犹如人在学习饶口令不多看多学多练是不行的,下面是两个很经典的例子,很多书上都有,对于学习的重点在于理解*x和x的理解,他们并不相同,*x所表示的其实就是变量a本身,x表示的是变量a在内存中的地址,如果想明白可以输出观察cout<<*x"|"x;,当定义了int *x;后对x=&a的理解的问题.仔细阅读和联系下面的两个例子我想指针问题就不是难点

c++-C++中指针声明时,int* p=0跟int *p=0哪个比较好?为什么?

问题描述 C++中指针声明时,int* p=0跟int *p=0哪个比较好?为什么? 新手学习C++时候,发现有些书写 int* p=0; 有些书写: int *p=0; 这两个有区别吗?区别在哪里?为什么会有两种写法? 还有下面的两种有区别吗?区别在哪里? int* const p=0; int const *p=0; 解决方案 第一个问题,这是定义一个int* p指针变量,(int p)<--->(int p) 这两种是等价,编译器会处理中间的空白符问题.第二个问题,int *const

c语言中指针p 和 p++的问题

问题描述 c语言中指针p 和 p++的问题 int main() { int * ptr=(int*)malloc(10);//arr; printf("%dn",ptr); printf("%dn",ptr++); } 为什么输出的值是一样的呢? 解决方案 ptr就是当前指针, ptr++,在引用是,取得是当前指针的值,使用之后,该值自加,这是后自加的方式. 同理(*ptr)++ 值为当前指针所指的值,运算过后,指针指向下一个 解决方案二: ptr是一个指向数组的

线性表-数据结构顺序表合并中指针怎么用才能运行?

问题描述 数据结构顺序表合并中指针怎么用才能运行? 已知线性表LA和LB中的数据元素按值非递减有序,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列. 怎么改呢? 初学,数据结构小白 额..,用的顺序表 解决方案 http://blog.sina.com.cn/s/blog_9671d51801019cpj.html 解决方案二: 数据结构笔记--顺序表数据结构 顺序表及合并数据结构之顺序表

c语言结构体中指针数组怎样赋值

问题描述 c语言结构体中指针数组怎样赋值 定义一个结构体struct AS{ char *p[1]:}:怎样用gets函数给指针数组赋值呢? 解决方案 看Unix/Linux上的man: Standard C Library Functions gets(3C)NAME gets fgets - get a string from a stream SYNOPSIS #include char *gets(char *s); char *fgets(char *s int n FILE *str

c++类中指针、堆对象的问题

问题描述 c++类中指针.堆对象的问题 当调用析构函数释放对象时,不写delete语句释放成员指针所指的堆空间,那对象释放完之后,该指针是消亡了呢,还是仍然存在?如果存在,它又是指向哪里? 解决方案 指针本身是变量,当对象释放的时候,会把对象所有成员的值都释放.所以指针会消亡,但是那块堆内存还占用着,造成内存泄露! 解决方案二: 堆指针不delete,就会标记被使用,操作系统就不会回收,这样就会导致系统的内存泄漏. 解决方案三: 当对象释放的时候,会把对象所有成员的值都释放,所以指针会消亡,但是

c语言-C语言中指针和地址的问题

问题描述 C语言中指针和地址的问题 想问一下以下程序中printf输出的都是什么数字,与数组中的数字和位置有什么关系 #include int main(int argc, const char * argv[]) { int a[5] = {3,4,8,9,10}; double *p = (double *)&a; printf("%d ",(double *)p); int *q = p; printf("%d ",*q); // int b[7] =