C++ (二)字符串与指针

  • 字符串与指针

  1. 一般情况下,除了对字符串数组定义时初始化外,不能直接将字符串赋值给数组。
    char s[30];
    s = "good news";//错误
  2. 可以采用strcpy()函数对字符串数组赋值
    char s[30]; 
    strcpy(s, "Good News!"); //赋值
  3. 指针数组赋值

    char *p;
    p = "good news"//给字符型数组赋值

    注意:不能通过指针修改p的值,因为该字符串是常量,所有常量都被放在特殊的存储区内无法修该。

  4. 可以通过指针赋值来实现字符串交换
    int a[3];
    
    //指针每次加1,跳转指针对应类型的步数
    
    a+1        地址+4//因为a指向a[0],为int变量
    *(&a)+1    效果同上
    &a+1       地址+16//因为&a指向整个数组,为4*int变量
    
    a / *(&a) / &a //这三个指针都指向a[0]变量的首地址 
                   //但是&a的含义不同

  5. 二维数组

  6. 一个数组名如果不出现在“&”后面 —— 则数组名是 “指向数组首元素的指针”

  7. 一个数组名如果出现在“&”后面 —— 则数组名返回 “指向数组的指针”

  8. int a[3][3];//二维数组
    
    &a        表示指向整个二维数组的指针
    a         表示指向第一个小数组a[0]的指针
    a[0]      表示指向第一个小数组的第一个元素a[0][0]的指针
    a[0][0]   表示a[0][0]地址里的内容
    
    a        =    &a[0]
    a[0]     =    &a[0][0]
    a[0]     =    *a
    a[0][0]  =    **a
    int a[3][3] = {1,2,3,4,5,6,7,8,9};
    int (*p)[3];//定义一个指向“包含四个int类型元素的一维数组”的指针
    int i,j;
    p = a;//a和p的基类型相同,都是指向“包含四个int类型元素的一维数组”的指针
    
    //下面“=”表示相当于
    *(*(p+i)+j)    =    a[i][j]    =    p[i][j]
    p+i            =    &a[i]
    *(p+i)         =    a[i]
    *(p+i)+j       =    &a[i][j]

  • “&” 和“*”

  1. “&” —— 上升一级
  2. “*” —— 下降一级

指针指向的是存储单元的内容,即变量,而不是变量的值(*p可以代表变量,对变量进行赋值)

int a[];
int *pointer;
pointer = &c;

pointer+i    =    a+i        =    &a[i]
*(pointer+i) =    *(a+i)     =    a[i]
pointer[i]   =    *(poiner+1)=    a[i]

猜你喜欢

转载自blog.csdn.net/lixiaoguai2017/article/details/85099611