• 关于取数组地址的识记(&s+1,s+1,&s[0]+1)


     1 #include <stdio.h>
     2 #include <malloc.h>
     3 
     4 int main()
     5 {
     6 char s1[] = {'H', 'e', '1', '2', 'o'};
     7 char *p=(char *)(s1+3);
     8 printf("*p:%c
    ",p[0]);
     9 char *p2=(char *)(&s1[0]+4);
    10 printf("*p2:%c
    ",p2[0]);
    11 char *p3=(char *)(&s1+1);
    12 printf("*p3:%c
    ",p3[-1]);
    13 
    14 return 0;
    15 }

    输出:
    *p:2
    *p2:o
    *p3:o

    在这之前,取数组值时老是不能区分s1+2,&s1[0]+2,&s1+2之间的区别,今天特意测试了下,原来他们的区别如下:

    s1+2:

    指从s1数组0位开始向下移动2位的取值。

    &s1[0]+2:

    同s1+2一样,指从s1数组0位开始向下移动2位的取值。

    特别注意点:&s1+1:

    指的是移到s1整个数组的下一个位置,相当于移出了s1数组。

    特别注意:

    int main(){
    char *lines[5] = {
    "COSC1283/1284",
    "Programming",
    "Techniques",
    "is",
    "great fun"
    };
    char *str1 = lines[1];
    char *str2 = *(lines + 3);
    char c1 = *(*(lines + 4) + 6);
    char c2 = (*lines + 5)[5];
    char c3 = *lines[0] + 2;
    printf("str1 = %s ", str1);
    printf("str2 = %s ", str2);
    printf(" c1 = %c ", c1);
    printf(" c2 = %c ", c2);
    printf(" c3 = %c ", c3);
    return EXIT_SUCCESS;
    }

    输出 :

    str1 = Programming
    str2 = is
      c1 = f
      c2 = 2
      c3 = E

    上面的题目中:
      • lines[1]:它是一个指针,指向字符串string1,即string1的首地址。
      • *(lines + 3):lines + 3 为lines[5]数组第3个元素的地址,*(lines + 3)为第3个元素,它是一个指针,指向字符串string3。
      • *(*(lines + 4) + 6):*(lines + 4) + 6 == lines[4] + 6 == string4 + 6,为字符串string4第6个字符的地址,即 f 的地址,*(*(lines + 4) + 6) 就表示字符 f。
      • (*lines + 5)[5]:*lines + 5 为字符串 string0 第5个字符的地址,即 2 的地址,(*lines + 5)[5]等价于*(*lines + 5 + 5),表示第10个字符,即2。
      • *lines[0] + 2:*lines[0] 为字符串string0 第0个字符的地址,即C的地址。字符与整数运算,首先转换为该字符对应的ASCII码值,然后再运算,所以 *lines[0] + 2 = 67 + 2 = 69。不过要求输出字符,所以还要转换成69所对应的字符,即E。

    而lines,是一个指向指针的指针,它的类型为 char **,所以 *lines 是一个指向字符的指针,**lines是一个具体的字符。这一点很重要,一定要明白。

  • 相关阅读:
    云计算解决方案百度文库
    【QA5】【mysql问题】ERROR 1045 (28000): Access denied for...
    linux系统管理 简单常用命令
    【QA4】【sudoers问题解决】(*** is not in the sudoers file.This incident will be reported)
    自动化测试框架实践1autotest
    Syndication命名空间实现RSS功能学习
    Javascript中撤销方法
    asp.net 中一次性更新所有GRIDVIEW的记录(转)
    Oralce 一次执行多条语句
    asp.net 防注入式攻击
  • 原文地址:https://www.cnblogs.com/ltlly/p/4225641.html
Copyright © 2020-2023  润新知