什么是指针

* 指针变量:用来存储某种数据在内存中的地址.
*
世面上书籍一般把指针和指针变量的概念混在一起了.
市面上的书籍说的指针指的就是指针变量

Ø *号的三种含义
1. 两个数相乘
int i =5;
int j =
5;
i*j;

2. 基本类型* 表示这种类型的指针变量
- 指向内存中这种类型的变量的地址
int i= 3;
int* p;可以存放i的地址
p=&i

3.
指针变量前加* 表取出这个指针变量里的数据
  int* p;
  *p
把地址里的数据取出来

指针常见错误
  * 野指针:指针变量没有定义指向的地址,该指针就不能赋值(点我就蓝屏)

  int* p;//声明一个指针变量用来存放一个地址
  //指针变量未经赋值,不可以使用.
  //*p 野指针.
  printf("*p=%d\n",*p);

*
每种数据类型的地址,必须用当前类型的指针变量表示

  double d =
3.14;
  int *p ;//指针变量存储int类型数据的地址
  //每种数据类型的地址,必须用当前数据类型的指针变量表示.
  p = &d;
  printf("*p=%lf\n",*p);

Ø 值传递和引用传递
  * 引用传递:如果传递的值是一个内存地址,通过这个地址可以找到地址对应的引用
  * 值传递:传递具体的数值
  * 在java语言中对象实际上存放在某个内存地址里面,传递对象就相当于传递的是内存地址(引用传递)

Ø 指针的应用场景
  让函数返回一个以上的值
  直接访问硬件 (opengl 显卡绘图)
  快速传递数据(指针表示地址)
  表示复杂的数据结构(结构体)
  方便处理字符串
  指针有助于理解面向对象


  • 指针就是地址,地址就是指针

  • 地址就是内存单元的编号

  • 指针变量是存放地址的变量

  • 指针和指针变量是两个不同的概念

  • 但是要注意:
通常我们叙述时会把指针变量简称为指针,实际它们含义并不一样


#include<stdio.h>

#include<stdlib.h>

main() {

int i = 5;

//写一个一级指针

int* p = &i;

printf("p = %d \n",*p);

//二级指针

int** pi = &p;

printf("pi =%d \n",*(*pi));

printf("pi =%d \n",**pi);

//三级指针

int*** pp = & pi;

printf("pp = %d \n",***pp);

}

C之指针的更多相关文章

  1. TODO:Golang指针使用注意事项

    TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...

  2. enote笔记法使用范例(2)——指针(1)智能指针

    要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...

  3. C++虚函数和函数指针一起使用

    C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...

  4. C++11 shared_ptr 智能指针 的使用,避免内存泄露

    多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...

  5. c 数组与指针的使用注意事项

    数组变量和指针变量有一点小小的区别 所以把数组指针赋值给指针变量的时候千万要小心 加入把数组赋值给指针变量,指针变量只会包含数组的地址信息 而对数组的长度一无所知 相当于指针丢失了一部分信息,我们把这 ...

  6. Marshal.Copy将指针拷贝给数组

    lpStatuss是一个UNITSTATUS*的指针类型实例,并包含SensorDust字段 //定义一个数组类型 byte[] SensorDust = new byte[30] //将指针类型拷贝 ...

  7. C++智能指针

    引用计数技术及智能指针的简单实现 基础对象类 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { ...

  8. EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针

    一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...

  9. 智能指针shared_ptr的用法

    为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈 ...

  10. 智能指针unique_ptr的用法

    unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...

随机推荐

  1. java入门学习总结_04

    1.循环结构 2.方法 循环结构 概述 1.对于某些需要重复执行的,相同或者相似的语句,使用某种格式来完成对代码的简化. 2.实现的语句: for语句[常用] while语句[常用] do...whi ...

  2. springboot和Redis集群版的整合

    此篇接上一个文章springboot和Redis单机版的整合 https://www.cnblogs.com/lin530/p/12019023.html 下面接着介绍和Redis集群版的整合. 1. ...

  3. java - day009 - 基础API,object,String, StringBuilder/StringBuffer, 正则表达式

    API java.lang.object object 所有类的顶层父类 一个类如果不继承其他类,默认继承object.    toString() 获得一个对象的字符串表示     可以重写     ...

  4. Linux命令——netstat

    参考:20 Netstat Commands for Linux Network Management Foreword Print network connections, routing tabl ...

  5. Python 数据类型和控制结构

    Python是一门脚本语言,我也久闻大名,但正真系统的接触学习是在去年(2013)年底到今年(2014)年初的时候.不得不说的是Python的官方文档相当齐全,如果你是在Windows上学习Pytho ...

  6. mysql中FIND_IN_SET()和GROUP_CONCAT()的使用

    知识点:mysql中FIND_IN_SET和GROUP_CONCAT()的使用 (一) 场景:当我们使用mysql数据库,查询一张的数据,其中的一列存放的是是另一张表id用“,”拼接的字符串 如下图所 ...

  7. 同一网断多套keepalived,vrid冲突问题排查

    注意: 同一网段中virtual_router_id的值不能重复,否则会出错,相关错误信息如下. Keepalived_vrrp[27120]: ip address associated with ...

  8. 学习Python编程的最好的几本书

    读书是汲取某个特定学科的知识以及更深入的理解该学科的最好的方式.在这个科技世界,通晓计算机系统各个不同的技术领域是至关重要的.其中最重要的内容之一便是计算机程序语言.现今,计算机中存在许多不同类型的程 ...

  9. 2019HDU多校第三场 K subsequence——最小费用最大流

    题意 给定一个 $n$ 个整数的数列,从中至多选取 $k$ 个上升子序列(一个元素最多被选一次),使得选取的元素和最大. 分析 考虑这个问题和经典网络流问题“最长不下降子序列”相似,我们考虑对这个建图 ...

  10. C# Dynamic动态对象

    1.ExpandoObject dynamic expObj = new ExpandoObject(); expObj.FirstName = "Daffy"; expObj.L ...