• [C++]指针和指向数组的指针[一维数组与指针]


     1.一维数组与指针
      
        形如:int型 数组 a[10]  
                  1)&a[0]  地址常量;地址类型:int *型   ; 存储数组a的首地址
                  2) a        地址常量;地址类型:int *型   ; 存储数组a的首地址        即  a与 &a[0]等价 
       形如:指向一维数组的指针变量 
                  如有定义: int a[10],*p;
                  ①p = &a[6];     //表示将a[6]的地址赋给指针变量p
                  ②p = a
                     p = &a[0]       //均表示将数组a的地址(or a[0]的地址)赋给指针变量p
       形如:指针可进行的运算
                   预先定义:指针变量p,数组a[10],正整数n;
                       1)指针 ± 数值  【实际值:p±n*size |  其中size指p的基类型所占用的存储字节数】
                             p + n :指向a[i]后面的第n个元素;
                             p - n  :  指向a[i]前面的第n个元素;
                            
                             ※若定义:*p = a;
                                 则: 
                                     *(a+i)   或者   a[i]
                                     *(p+i)    或者  p[i]         //四者意义:访问数组a中的第i个元素 
                                本质与区别:
                                                   1.p与a数据类型均为int *型;
                                                   2.p是指针变量;a是指针常量(指向不可改变)
                       2)指针 -指针 
                         前提:指向相同类型的指针变量可以相减
                          结果:两指针所指向的地址之间数据的个数(单位:数据类型,并非字节数)
                          Eg:
                               int *px,*py,n,a[5];
                               px = &a[1]; 
                               py = &a[4]; 
                               n = py - px;  //结果:n = 3
                               n = px - py;  //结果: n = -3 
            3)指针的比较运算(<,>,==,!=,<=,>=)
                实质:比较两个地址值的大小。
                              结果:1 or 0
                             Eg:px == py  //两地址相同?0:1
                                  px < py    //px<py?0:1
                                  px==NULL //px为空指针?0:1
                                  即  真为0;假为1 
    --------------------------------------------------------------------------------------------------------
    元素的地址:                                                         元素的值:
            a+i   数组名法                                                        *(a+i)      数组名法                           
            p+i   指针法                                                            *(p+i)      指针法
            &a[i] 下标法                                                             a[i]        下标法  
            &p[i]下标法                                                              p[i]        下标法  
    ---------------------------------------------------------------------------------------------------------
    典型例子1:分别求数组前十个元素和后十个元素之和
    #include<iostream>
    int fsum(int *array,int n) {     //通用的求和函数
         int  i,s = 0;
         for(i = 0;i<n;i++)
              s += array[i]
        return (s);

    void main(void){
       int a[15] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
       int shead ,stail;
       shead = fsum(&a[0],10);   //or fsum(a,10)
       stail = fsum(&a[5],10) ;     //or fsum(a+5,10) 
    }            
    ---------------------------------------------------------------------------------------------------------
    典型例子2:比较两字符串的大小:
      int my_strcmp(char *s,char *p){
         for(;*s==*p;s++;p++)
                 if(*s=='')  reutrn (0);  //如果都比较到最后一个字符了,那么二者相等
         return (*s-*t)>0?1:-1;     
  • 相关阅读:
    BZOJ 4511 洛谷3131 USACO 16.Jan 七子共
    Atcoder Code Festival 2017 qual C 10.22 D题题解
    hdu 5122(2014ACM/ICPC亚洲区北京站) K题 K.Bro Sorting
    HDU 5115 (2014ACM/ICPC亚洲区北京站) D题(Dire Wolf)
    POJ
    hihocoder 1032 最长回文子串(Manacher)
    hihocoder 1015 KMP算法
    Trie树 hihocoder 1014
    POJ 3468 线段树区间修改查询(Java,c++实现)
    atCoder Ants on a Circle(又是蚂蚁问题。。。)
  • 原文地址:https://www.cnblogs.com/johnnyzen/p/7155233.html
Copyright © 2020-2023  润新知