区别<指针、指针的地址、指针的值>

指针是指向某一个类型(内置的或者自定义的)的对象的变量。

通常我们说的“指针”,意指它所指向的对象的地址,也就是“指针的值”;

但是指针本身也是变量,也对应内存中的一块地方,因此“指针的地址”就是存储这个指针变量的内存的地址;

结合代码来看:

/*************************************************************************
    > File Name: newd.cpp
    > Author: zeyuhu
    > Mail: [email protected]
    > Created Time: Sat 11 Oct 2014 02:36:53 PM CST
 ************************************************************************/

#include<iostream>
using namespace std;

class A
{
    public:
        A(int *_p):p(_p)
    {

    }
        int *p;
};
int main()
{
    int *b = new int[2];
    b[0] = 1000;
    b[1] = 1001;
    A *a = new A(b);

    cout<<a->p<<endl;
    cout<<&(a->p)<<endl;
    cout<<*(a->p)<<endl;

    cout<<endl;

    cout<<a<<endl;
    cout<<&a<<endl;

    delete a;
}

输出

a->p :指针的值。即A类型对象*a的成员变量(指针p)的值,因为p本身也是一个指针,所以可以用*(a->p)取得值1000;

&(a->p):指针的地址。p作为对象*a的一个成员变量,有一个在对象a被构造时分配的内存地址。我们注意到这个地址和后面对象a本身的地址相同,因为p是A的第一个数据成员。

a:指针的值。a是一个指向A类型对象的指针,a的值是该对象在内存中的地址。

&a:指针的地址。注意到,因为a指向的对象所在的内存空间是堆空间,但是a本身却是存储在栈中的一个指针变量,所以a是堆地址,而&a则是栈地址。

另外的分析:如果类中有指针类型的数据成员,而且它们指向的空间是用new手动分配的,那么,如果不手动去释放,那么这些空间是无法自动释放的。因为类默认的析构只能将栈中的变量(例如上面的p)清空(置0)。

这也表明:涉及到指针成员的类之间的拷贝不能仅做指针(也就是指针的值)的浅拷贝,因为很容易造成同一处空间被释放多次的错误。

还有,如果使用指针参数作为函数的形参,那么,只要不手动释放该指针所指向的空间,那在调用过程中,针对形参指针的操作不会对原实参指针有任何影响,因为它只是原指针(指针的值)的一个拷贝而已。

时间: 2024-10-05 09:53:05

区别<指针、指针的地址、指针的值>的相关文章

打印指针指向的地址值

废话不多说,直接上错误代码: static void print_cpu_src(uint8_t * src,int stride){ int i,j; printf("Magnum cpu src addr == %p, stride ==%d:\n",&src,stride); for (i = 0; i < 11; ++i) { printf("\n"); for (j =0; j < 4; ++j) { printf("%d ,

派生类地址比基类地址少4(子类与基类指针强行转换的时候,值居然会发生变化,不知道Delphi BCB是不是也这样) good

大家对虚表并不陌生,都知道每个含有虚函数的类对象都有1个虚指针,但是在现实使用中,却总是因为这而调试半天,才发现原来是虚指针惹的祸.我这几天在调试代码时候也中招了,我的问题是这样的,如下图,CTree是最底层基类(非虚类), CSamplerTree(虚类)派生自CTree,CMSamplerTree,CASamplerTree派生自CSamplerTree,                                                         CTree中包括两个成员

指针数组和数组指针的区别

数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长.也就是说执行p+1时,p要跨过n个整型数据的长度. 如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组. p=a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++;       //该语句执行过后,也就是p=p+

新手,对函数,函数指针,回调函数, 函数指针作为函数的返回值和block的一些见解

很多初学者,学c语言时,看到函数都觉得难,我也是,一开始觉得函数太难了,后来慢慢就理解了 第一:函数 在c语言中最简单的函数一般有四种: 1, 无返回值, 无参数. 2, 无返回值,有参数. 3, 有返回值,无参数. 4, 有返回值,有参数 1, 无返无参  定义方式:      void 函数名(); 一般不怎么用这种形式的函数,可用来输出,打印 void functionOne() { printf("无返回值,无参数"); // 没有返回值不能写return } int main

go 方法接受者 是指针类型和非指针类型的 区别

go 方法接受者 是指针类型和非指针类型的 区别 非指针类型 package main import "fmt" // 定义接口 type Car interface { GetName() string Run() } // 定义结构体 type Tesla struct { Name string } // 实现接口的GetName()方法 func (t Tesla) GetName() string { t.Name = "test" return t.Na

c指针 --笔记2返回指针值的函数

返回指针值的函数 一般带回指针值的函数,定义形式为: int *a (int x, int y); 看这个经典案例: #include <stdio.h> int main(int argc, char const *argv[]) { double score[][4] = {{60.0, 70.0, 80.5, 20.1}, {60.0, 70.0, 80.5, 21.1}, {60.0, 70.0, 80.5, 22.1}}; double *search(double(*pointer

【转】 指针函数与函数指针的区别

一. 在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1.指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符    *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值.函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量. 表示: float *fun();

地址/指针和字符串

今天做作业时,发现下列一个问题. 首页是这个自编的strncpy函数: #include "ctype.h" #include "stdlib.h" #include "string.h" #include "windows.h" int main() { char *strata(char s1[],char s2[],int n); char nam1[41]="das"; char nam2[41]=

深入理解指针—&gt;指针函数与函数指针的区别

一. 在学习过程中发现这"指针函数"与"函数指针"容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1.指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符    *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值.函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量. 表示: f

(转)指针函数与函数指针的区别

一.在学习C过程中发现这"指针函数"与"函数指针"容易搞错. 1.指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符    *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值.函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量. 表示: float *fun(); float *p; p = fun(a);