首页 > 编程语言 >C++指针

C++指针

时间:2023-03-26 11:02:40浏览次数:41  
标签:iArray int iPtr void C++ 数组名 指针

1 指针的概念

#include <iostream>
using namespace std;
/*
间接引用指针时,可获得该指针指向的变量内容 
本部分参考内容:C++ 程序设计教程 钱能   清华大学出版社 
*/
void zhizhen1()
{
    int* iPtr;
    int iCount=18;
    //* 放在可执行语句中的指针之前,成为间接引用操作符
    iPtr=&iCount;
    //* 放在指针定义中时,称指针定义符 
    cout<<*iPtr<<endl;
    cout<< iPtr<<endl;
    *iPtr=58;
    cout<< iCount<<endl;
    cout<< iPtr<<endl;
}
void zhizhen2()
{
    /*
    *iPtr的类型是整数 ,指针iPtr指向该整数,所以iPtr的类型是整型指针,
    而iPtr的地址(&iPtr) 的类型是整型指针的地址,即指向整型指针的指针。
    指针的地址是二级指针     
    */     
    int iCount=18;
    int* iPtr=&iCount;
    *iPtr=58;
    cout<<iCount<<endl;//58
    cout<<iPtr<<endl;//iCount所在的地址
    cout<<&iCount<<endl;//iCount所在的地址
    cout<<*iPtr<<endl;//iCount的值
    //指针也是变量,是变量就具有的内存地址,所以指针 也有地址 
    cout<<&iPtr<<endl;// iPtr本身的地址    
} 
void zhizhen3()
{
    int iCount=26;
    int* iPtr=&iCount;
    //指针值不是整型数 
    //* iPtr=(int)&iCount;
    *iPtr=50;
}
void zhizhen4()
{
    //指针的初始化,指针变量的初始化的值为该指针类型的地址值
    //不要将 int* iPtr=&iCount与 * iPtr=&iCount混搅
    //前者是定义语句,*是指针定义符,C++为iPtr指针分配一个指针空间,并用iCount的地址初始化
    //后者是赋值语句,左右两边地址不匹配
    //指针要在使用前初始化 
    int iCount;
    int* iPtr=&iCount;//初始化未整型地址 
    *iPtr=58; 
    cout<<*iPtr<<endl;//iCount的值
    cout<<iCount<<endl;
}
void zhizhen5()
{
  //指针类型与实际存储的匹配
  //指针是有类型的    ,给指针赋值,不但必须是一个地址,而且应该是一个该指针类型相符的变量或变量地址
  //指针具有一定的类型,它的值为地址的变量,该地址是内存中另 一个该类型变量的存储位置,或者说指针是具有某个类型的地址 
  float f=34.5;
  float* fPtr=&f; 
  float* f1Ptr; 
  //int* iPtr=&f;//    [Error] cannot convert 'float*' to 'int*' in initialization  
  cout<<f<<endl;  
  //cout<<iPtr<<endl;
  cout<<fPtr<<endl;
  f1Ptr=fPtr;
   cout<<*f1Ptr<<endl;
}


 

void zhizhen6()
{
    //指针运算
    //只有加法和减法可以进行指针运算 
    int aArray[10];
    int sum=0;
    int* iPtr=aArray;
    cout<<sizeof(*aArray)<<endl;
    
    char fArray[10];
    cout<<sizeof(*fArray)<<endl;
    for (int i=0;i<10;i++)
    {
        //a[i] 等价 *(a+i) 等价于 iPtr[i] 等价于*(iPtr+i)         
        //aArray[i]=i*2;
        //*(iPtr+i)=i*2;    
        //iPtr[i]=i*2;    
        *(aArray+i)=i*2;
        //指针和数组
        //数组名可以直接拿来初始化指针,数组名就是数组第一个元素的地址。 
        //即对于数组a,有:a 定于&a[0]
        // int a[100] ; int* iPtr=a;
        //a[i] 等价 *(a+i) 等价于 iPtr[i] 等价于*(iPtr+i)  下标操作是针对地址而不仅仅是针对数组名
        //&a[i]等价于a+i等价于iPtr+i等价于&iPtr[i]
    }
    for (int i=0;i<10;i++)
    {
        sum+=*iPtr; 
        cout<<"aArray  地址"<<iPtr<<endl;
        cout<<"sum is"<<sum<<endl;
        iPtr++;
        //sum+=*(iPtr++) ;
    }    
    cout<<"sum is"<<sum<<endl;
}

 

C++指针_数组

指针与数组

void zhizhen7()
{
    int sum1=0,sum2=0,sum3=0,sum4=0,sum5=0;
    int iArray[]={1,4,2,7,13,32,21,48,16,30};
    int* iPtr;    
    int size,n;
    size=sizeof(iArray)/sizeof(*iArray);//元素个数
    for (n=0;n<size;n++) 
    {
        sum1+=iArray[n];
    }
    iPtr=iArray;
    for (n=0;n<size;n++)
    {
        //cout<<*iPtr<<"    "<<sum2<<endl;
        sum2+=*iPtr++;        
        //sum2=sum2+*iPtr;
        
        //iPtr++;
    }
    cout<<sum2<<endl;
    iPtr=iArray;
    for (n=0;n<size;n++)
    {
        sum3+=*(iPtr+n) ;
    }
    iPtr=iArray;
    for (n=0;n<size;n++)
    {
        sum4+=iPtr[n];
    }
    iPtr=iArray;
    for (n=0;n<size;n++)
    {
        sum5+=*(iArray+n);
    }
    
    cout<<sum1<<endl
        <<sum2<<endl
        <<sum3<<endl
        <<sum4<<endl
        <<sum5<<endl;        
    
}

 数组名是指针常量,区别于指针变量,所以给数组名赋值时错误的

对于编译器来说,数组名表示内存中分配了数组的固定位置,修改了这个数组名,就会丢失数组空间,所以数组名所代表的地址不能被修改。



标签:iArray,int,iPtr,void,C++,数组名,指针
From: https://blog.51cto.com/u_1017534/6149935

相关文章

  • ubuntu20.04 安装TensorRT c++库
    官方那个文档上有很多中安装方法,这里采用压缩包安装,解压后直接将lib和include文件配置在环境变量里就ok了,对于c++来说是最方便的首先下载TensorRT:https://developer.nvidia.......
  • C/C++ 恨透了 double free or corruption
    *以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/IwSVImp5cOB3gZbaf0YiPw写过C/C++的都知道,内存允许程序员自主......
  • C++ sort 函数 以及 priority_queue 的使用
    1.sort函数的使用sort函数的定义:sort(first,end,compare);sort对[first,end)范围内的元素进行排序。默认为升序排序(此时不需要传入compare)。当需要降......
  • C++ 直接初始化和拷贝初始化
    首先我们介绍直接初始化:编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数。文字描述可能会让你们云里雾里,那我们直接看代码://先设计这样的一个类class......
  • C++ STL摘记
    一、string类补充1.函数示例:(1)find和rfind函数,返回的是下标或者string::nposindex=ss.find(s1,pos,num)find从pos(包括)开始往右查找(num的作用待补充)index=s......
  • C/C++保安值班安排系统[2023-03-25]
    C/C++保安值班安排系统[2023-03-25]题目十五:保安值班安排系统问题描述:某公司有7名保安人员,由于工作需要进行轮休制度,一星期中每人休息一天。预先让每一个人选择自己认为......
  • Leetcode 15 & 16 (双指针)
    都是比较经典的双指针问题,我们可以从中总结一些双指针的规律首先这两题如果en做的话就是\(O(n^{3})\)的算法,暴力去找。但是我们可以发现这三个值是满足一定约束的,所以......
  • C++命名规范
    C++命名规范共用准则只能是字母(A-Z,a-z)、数字(0-9)和下划线(_)组成,区分大小写文件、函数、类、变量名应当具有描述性类、自定义类型和变量名应当使用名词,函数名使用......
  • 数组指针
    一、概念下面哪个是数组指针?int*p1[10];int(*p1)[10];int(*p)[10];解释:p先和*结合,说明p是一个指针变量,然后指向一个大小为10的整型数组,所以p是一个指针,指向整型数组,叫做......
  • 面试高频问题之C++编译过程
    C++编译过程C++是一种高级编程语言,但是计算机并不能直接理解它。因此,需要将C++代码翻译成计算机可以理解的机器语言。这个过程就是编译过程,是C++程序从源代码到可执行文件......