指针也是变量,占有内存空间,用来保存内存地址。

指针也是一种数据类型,指针是一种数据类型,是指它所致内存空间的数据类型。

指针变量和它指向的内存块是两个不同的概念

  *p操作内存

  在指针声明时,*号表示所声明的变量为指针

  在指针使用时,*号表示操作指针所指向的内存空间中的值

  *p相当于通过地址(p变量的值)找到一块内存;

  然后操作内存 *p放在等号的左边赋值(给内存赋值)

  *p放在等号的右边取值(从内存获取值)

#include <iostream>
using namespace std;
#include <stdio.h>
void change(int num){
num=666;
}
void changeA(int *num){
*num=666;
}
void printfSingleArrayInt(int *p,int n){
cout<<"/**********************************/"<<endl;
cout <<p<< endl;
cout<<sizeof(p)<<endl;//4
for(int i=0;i<n;i++){
cout<<*(p+i)<<endl;
}
cout<<"/**********************************/"<<endl;
}
void printfSingleArrayIntS(int a[10]){
cout<<"/*****************s*****************/"<<endl;
cout<<sizeof(a)<<endl;//4
for(int i=0;i<10;i++){
cout<<*(a+i)<<endl;
}
cout<<"/**********************************/"<<endl;
}
int main(){
int a[10]={0};
for(int i=0;i<10;i++){
a[i]=i;
}
int *p;
//指针的步长,根据所指内存空间类型来定。
cout<<sizeof(p)<<endl;//4
p=a;
cout<<sizeof(p)<<endl;//4
cout<<sizeof(a)<<endl;//40
cout<<sizeof(a+1)<<endl;//4
cout<<sizeof(&a)<<endl;//4
cout<<sizeof(&a+1)<<endl;//4
printfSingleArrayInt(p,10);
printfSingleArrayIntS(a);
printf("%d %d\n",a,a+1);
printf("%d %d\n",&a,&a+1);
return 0;
}
int main01()
{
int num=100;
int *p=&num;
cout <<&num<< endl;//打印num的地址 num=1;//直接修改num的值
cout <<num<< endl;//打印num的值 *p=100000;//间接修改num的值
//*p放在等号的左边间接修改内存空间的值
/** *p 的意义:*就像一把钥匙,根据一个指针变量的值,去修改门后门的内存空间 **/
cout <<num<< endl; change(num);
cout <<num<< endl;
/*
间接赋值成立的三个条件
a)2个变量(通常一个实参,一个形参)
b)建立关系,实参取地址赋给形参指针
c)*p形参去间接修改实参的值
*/
changeA(p);
cout <<num<< endl; int a=*p;////*p放在等号的右边从内存空间中拿值
cout <<a<< endl;
/*
{
char *b=NULL;
*b='j';
}
*/
return 0;
}

    cout<<sizeof(a)<<endl;//40   a所对应的地址所包含数据类型的长度
cout<<sizeof(a+1)<<endl;//4
cout<<sizeof(&a)<<endl;//4 &a是数组a的地址,占四个字节
cout<<sizeof(&a+1)<<endl;//4 &a+1是数组a+1的地址,占四个字节

a,a[0],&a这三个元素打印的地址是相同的。

a+i 表示的是以内存地址a移动了i个int的地址。

    printf("%d %d\n",a,a+1);
    printf("%d %d\n",&a,&a+1);

&a 与 &a+1 之间相差了几个元素呢?

  &a代表的是把数组看成一个整体取地址

  &a + 1 则表示数组作为一个整体移动了一个元素(数组)。

间接赋值成立的三个条件

a)2个变量(通常一个实参,一个形参) b) 建立关系,实参取地址赋给形参指针 c) *p形参去间接修改实参的值

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. js原生语法实现表格操作

    HTML页面: <!doctype html> <html lang="en"> <head> <meta charset="U ...

  2. windbg 加载dump监测蓝屏原因时出现重复的星星框提示解决办法

    加载dump文件出现了重复上边的信息 总结: 要reload一下环境,说明符号库未加载出现的错误,!sym noisy 显示详细信息 ,reload重载符号库,未找到的,从服务器进行下载, 注意,第一 ...

  3. Atom打开txt文件中文乱码解决、指定文件的语法格式、win10中禁止睡眠

    1.Atom中文乱码解决 首先保证打开的txt文件的编码格式为UTF-8无BOM编码格式,可以使用Notepad++更改,如下图所示: 然后再在atom中打开文件,并右键点击文件内容的任意位置,Cha ...

  4. P<0.05就够了?还要校正!校正!3个方法献上

    P<0.05就够了?还要校正!校正!3个方法献上 (2017-01-03 17:55:12) 转载▼   分类: 数理统计 (转  医生科研助手 解螺旋 微信公众号)   当有多组数据要比较时, ...

  5. 百度云的ubuntu16.04.1部署Apache服务器+Django项目

    使用Apache和mod_wsgi部署Django 是一种久经考验的将Django投入生产的方法. mod_wsgi是一个Apache模块,可以托管任何Python WSGI应用程序,包括Django ...

  6. django POST表单的使用

    环境如下:django 1.7.8 版本. 1.在POST表单的时候会出现这个错误提示. 禁止访问 (403) CSRF验证失败. 相应中断. Help Reason given for failur ...

  7. Python之路(第二十三篇) 面向对象初级:静态属性、静态方法、类方法

    一.静态属性 静态属性相当于数据属性. 用@property语法糖装饰器将类的函数属性变成可以不用加括号直接的类似数据属性. 可以封装逻辑,让用户感觉是在调用一个普通的数据属性. 例子 class R ...

  8. mysql 设置用户并授权

    一, 创建用户: 命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明:username - 你将创建的用户名, host - 指 ...

  9. Java开发环境安装配置

    电脑配置:Win7 64位 JDK1.8+Apache Tomcat8.5.4 下载JDK1.8 全名: Java SE Development Kit 8u151,下载最新稳定版本 下载地址:htt ...

  10. Vue 使用中的小技巧

    在vue的使用过程中会遇到各种场景,当普通使用时觉得没什么,但是或许优化一下可以更高效更优美的进行开发.下面有一些我在日常开发的时候用到的小技巧,在下将不定期更新~ 1.多图表resize事件去中心化 ...