C++ 之 指针详解篇(一)

  C++的指针太重要了,我们有必要去掌握它。所以必须认真的对待指针。先来讲解什么是指针。(重点掌握)

  指针是存储内存地址的变量,内存又是什么?内存是干啥用的?简单的说,就是存储一些二进制数据,它是按一定的顺序存储的线性单元结构。那一个数据又是如何存储在内存的呢?这些问题都是汇编的基础知识,如果你学过汇编理解这真的不是难事。闲话越扯越远了,通常数据的存储在内存地址中,不同的计算机它的地址也会不同。假设我们存储了一个变量是整形的,系统会自动的分配一个内存地址给它,要获取内存地址,可以用&运算符。结合示例演示

#include <iostream>
using namespace std;
int main()
{
    int i;
    long j;
   bool t;
    i = 5;
    j = 100L;
    t = true;
    cout <<"i = "<<i<<", &i = "<<&i<<endl;
    cout<<"j = "<<j<<", &j ="<<&j<<endl;
    cout<<"t ="<<t<<", &t = "<<&t<<endl;
    return 0;
}输出结果为:

i = 5, &i = 0012FF7C
j = 100, &j =0012FF78
t =1, &t = 0012FF70

这里的i,j,t的地址用&运算符就可以得到。

  每个变量都有地址,我们不知道变量的具体地址,这个时候可以用指针来存储就很方便,当我们需要访问变量的地址的时候,一个指针就轻松的帮我们解决问题。那如果定义一个指针呢?

  很简单假如我们存储变量是整形的

  int *p;

  先来理解这句话的含义:p是一个int类型的指针,p也就可以存储一个变量的地址如上所示

  p = &i;

  我们就用p存储了i的地址,是不是很方便啊,现在我们已经清楚的知道如何定义一个指针,就是在这个变量前加一个*号.

  我们只知道如何定义一个指针,如何使用指针?那如何去获取指针上的值呢?

  *p = i;

  刚才p指针指向了i的地址,那*p就是i地址上的值,我们可以上机实验就可以得知。我们知道用指针获取变量i上的值这是间接的访问了变量i

*号就是间接的访问了变量i *号具体含义就是存储变量地址上的值

  我们不能用

  p = i; //不能将一个变量(i)赋给一个地址(p)

  学好指针一定用弄清楚指针的地址,指针上的值。结合示例

using namespace std;
int main()
{
    int a;
    int* p;
    a = 5;
    p = &a;
    cout<<"*p = "<<*p<<endl;
    *p = 7;
    cout <<"*p = "<<*p<<" , a = "<<a<<endl;
    a = 0;
    cout<<"a = "<<a<<" *p= "<<*p<<endl;
    return 0;
}
输出结果:
*p = 5
*p = 7 , a = 7
a = 0 *p= 0  

从上得出结论当*p被改变的时候,a的值也会改变。当a的值发生改变,*p也会发生改变。也就说明*能改变一个变量地址上的值。
  那指针能定义一个数组类型的吗?答案当然是可以的。其实在c++中,数组名就是一个常量指针,指向了数组的第一个元素。

结合示例演示 数组和指针的关系

#include <iostream>
using namespace std;
int main()
{
    int i[5] = {1,2,3,4,5};
    const int* p = i;
    for (int j = 0; j< 5;j++)
    {
        cout<<"i["<<j<<"] = "<<p[j]<<endl;
    }
    return 0;
}输出结果

i[0] = 1
i[1] = 2
i[2] = 3
i[3] = 4
i[4] = 5

  我们用指针p访问了数组i,而数组i的地址就是第一个元素的地址,我们可以用p[j]或者用*(p+j)访问后面的元素,2者的输出结果一样。

时间: 2024-12-12 19:47:49

C++ 之 指针详解篇(一)的相关文章

C++ 之 指针详解篇(二)

使用关键字new动态分配内存,在new后面为其分配内存对象的类型,让编译器知道需要多少内存.new的返回值是一个内存地址,内存的地址被存储在指针中,因此将new的返回值赋给一个指针.如 short int* p; p = new short int; 或者声明指针的同时直接初始化, short int* p= new short int; 无论用哪种方式,p都指向了short int,然后就可以向变量的指针那样使用如 *p = 72; //将72放在动态内存中 使用完了指针记得一定要释放指针.可

C++ 之 指针详解篇(三)

Const指针 申明Const指针格式如下 const int* p; int* const p1; const int* const p2; 这些含义都各不相同,所以我们必须要会使用 p是指向整形的常量的指针,它指向的值是不可更改的. p1是一个指向整形的常量指针.它指向的值可以修改,但p1不能指向其他变量 p2是一个指向整形常量的常量指针.它指向的值不能修改,且这个指针也不能指向其他变量. 示例 class A //申明类A { public: A(); ~A(); void setleng

[转]C++ 智能指针详解

C++ 智能指针详解   一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见. 用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法.包括:std::auto_ptr.boost::scoped_ptr.boost::shared_ptr.boost::scoped_array.boost::shared

C++函数指针详解

学习c++的过程中,指针是难点,熟悉了指针之后,还有一个让人很蛋疼的难点,那就是函数指针了.本博文详细介绍一下常见的各种坑爹的函数指针. 至于指针的详细学习,推荐这篇博文C++指针详解 与数据一样,函数也有地址,函数的地址就是内存中存放函数语言代码的起始地址.函数指针就是指向这个地址.函数指针所指向的类型,就是函数本身.我们知道,指针所指向类型代表了指针所指向的内存区域的大小.所以函数指针所指向的类型,就是函数在内存中所占据内存的大小.知道了函数的起始地址和大小,所以函数指针可以很轻易的代替函数

C++ 智能指针详解

一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见. 用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法.包括:std::auto_ptr.boost::scoped_ptr.boost::shared_ptr.boost::scoped_array.boost::shared_array.boost:

彻底搞定C语言指针详解

1.语言中变量的实质 要理解C指针,我认为一定要理解C中“变量”的存储实质, 所以我就从“变量”这个东西开始讲起吧! 先来理解理解内存空间吧!请看下图: 内存地址→ 6 7 8 9 10 11 12 13 ----------------------------------------------------------------- ... | | | | | | | |.. ------------------------------- ---------------------------

C++ 智能指针详解(转)

C++ 智能指针详解   一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见. 用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法.包括:std::auto_ptr.boost::scoped_ptr.boost::shared_ptr.boost::scoped_array.boost::shared

C++培训 C++ 智能指针详解

C++培训 C++ 智能指针详解 一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见. 用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法.包括:std::auto_ptr.boost::scoped_ptr.boost::shared_ptr.boost::scoped_array.boost::sh

C++智能指针详解(真的很经典 )

C++ 智能指针详解   一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见. 用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法.包括:std::auto_ptr.boost::scoped_ptr.boost::shared_ptr.boost::scoped_array.boost::shared