• c++之路起航——指针


    c++一阶指针

    定义

           存储类型名 数据类型 * 指针变量名;

          Eg:int *a;//定义了一个指向整型的指针 a;

    指针使用方法

          int a,*b;

            b=&a;//表明将a的地址赋值给b;

            *b=5; //将b指针所指向的地址赋值给5;即等同于a=5;

    指针使用前必须赋一个合法的值
           int *a,b;
             *a=5;//这种表达方式是错误的,因为没有对a进行初始化,而就进行赋值。
    void *a//万能指针,可以接受任何类型的指针,
         int *a;
         void *b;
         char *c;
            b=a;//正确,因为void指针可以接受任何类型的指针
            a=b;//错误,因为void指针不能直接赋值给其他类型指针 正确写法应为a=(int *)b;将b强制类型转换为整形指针,在复制;
            c=(char *)b;//正确; 
    二阶指针//二阶指针,顾名思义,既为指向指针的指针;
           定义:存储类型 数据类型 ** 指针变量名
             Eg  int **p;//二阶指针
                   
    #include<iostream>
    Using namespace std;
    int main(){
    int i,*q,**p;
      i=123,q=&i,p=&q;//简单解释一下二阶指针,
    cout<<**p;
    return 0;
    }
    指针函数传值
         
    void swap(int *x,int *y){}
    int main()
    {int a,b,*p=&a,*q=&b;
    swap(p,q);
    swap(&a,&b);
     指针数组与数组指针
          指针数组
                 int *p[10];//定义了一个指针类型的数组,数组中每一个元素都为一个指针类型;
          数组指针
                 int(*p)[10];// 定义了一个指向数组的指针;         
    #include<iostream>
    #include<cstdio>
    using namespace std;
    int main()
    {
    int a[2][5]={1,2,3,4,5,6,7,8,9,0};
    int (*p)[5]=a;
    cout<<"*p[1]="<<*p[1]<<endl;
    cout<<"*(p[1]+1)="<<*(p[1]+1)<<endl;
    char *q[5]={"a","b","c","d","e"};//指针数组这样初始化dev会有警告,但vc不会有任何警告;不建议读者用这种初始化。
    cout<<"q[1]="<<q[1]<<endl;//因为q[10]为指针类型数组,所以q中存储的为地址。
    return 0;
    }
     指针函数与函数指针
         指针函数//返回值为指针的函数;
       定义:类型名 * 函数名(参数列表);
    Eg:int * max(int *x,int *y);
      {
          returen *x>*y?x:y;
       }
        函数指针//算法竞赛中基本不用,只顺便提一下,既为指向函数的指针;
               定义:函数类型 (*指针名) (函数形参表);
               Eg
    int max(int x,int y){return x>y?x:y;}
    int min(int x,int y){return x<y?x:y;}
    int main()
    { int a=1,b=2;
    int (*p)(int,int);
    p=max; cout<<p(a,b);//也可以写成(*p)(a,b),其中*运算没有意义
    p=min; cout<<p(a,b);
    return 0;  
    指针与数组
        c++中数组名既为一个地址;故可以赋值给指针变量;
          Eg
              int a[10];*p;
              p=a;//正确;
            二维数组—特殊的二阶指针;
                int b[10][10];
                将二维数组理解为矩阵;
                b为二阶指针;
                   b所指位置为行,称为行指针;
                   对b进行一次*运算,便转换为列指针,从而确定每一个元素所在位置。
                 int a[10],*b;
                       b=a;// 正确,b++;就相当于地址向右移动,b--就相当于地址向左移动,<,>,>=,<=,!=在指针运算中也适用  
                 int a[10][10],**b;
                      b=a;//这种方式是错误的.
                int a[10][10],(*b)[10]; 
                      b=a;//正确。
               int *(*P)[10];//指向指针数组的数组指针

    char a[20];

    int *ptr=(int *)a; ///强制类型转换并不会改变a的类型

    ptr++;

      在上例中,指针ptr的类型是int*,它指向的类型是int,它被初始化为指向整型变量a。接下来的第3句中,指针ptr被加了1,编译器是这样处理的:它把指针ptr的值加上了sizeof(int),在32位程序中,是被加上了4,因为在32位程序中,int占4个字节。由于地址是用字节做单位的,故ptr所指向的地址由原来的变量a的地址向高地址方向增加了4个字节。

    由于char类型的长度是一个字节,所以,原来ptr是指向数组a的第0号单元开始的四个字节,此时指向了数组a中从第4号单元开始的四个字节。
  • 相关阅读:
    qbzt day6 上午
    qbzt day5 下午
    qbzt day5 上午
    【7.24校内交流赛】T3【qbxt】复读警告
    【7.24校内交流赛】T1&T2
    一个一定要好好提溜出来的贪心题
    7.19 讲题
    DP大大大大大赏
    图论经典例题大赏
    数据结构题大赏
  • 原文地址:https://www.cnblogs.com/grhyxzc/p/5058597.html
Copyright © 2020-2023  润新知