#include <stdio.h>
#include <malloc.h> int main()
{
char s1[] = {'H', 'e', '', '', 'o'};
char *p=(char *)(s1+);
printf("*p:%c\n",p[]);
char *p2=(char *)(&s1[]+);
printf("*p2:%c\n",p2[]);
char *p3=(char *)(&s1+);
printf("*p3:%c\n",p3[-]); return ;
}

输出:
*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\n", str1);
printf("str2 = %s\n", str2);
printf(" c1 = %c\n", c1);
printf(" c2 = %c\n", c2);
printf(" c3 = %c\n", 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是一个具体的字符。这一点很重要,一定要明白。

关于取数组地址的识记(&s+1,s+1,&s[0]+1)的更多相关文章

  1. Delphi中使用@取函数地址的问题(转)

    Delphi中使用@取函数地址的问题   例如以下代码:unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes ...

  2. php 算法之切割数组,不用array_chunk(),算法之二,取数组的差值,不用array_diff()

    用php写算法切割数组,不用array_chunk();算法例如以下所看到的. <?php //$array 数组 //$size 每一个数组的个数 //每一个数组元素是否默认键值 functi ...

  3. 转载——JavaScript学习笔记:取数组中最大值和最小值

    转载自:http://www.w3cplus.com/javascript/calculate-the-max-min-value-from-an-array.html. 取数组中最大值 可以先把思路 ...

  4. JavaScript学习:取数组中最大值和最小值

    在实际业务中有的时候要取出数组中的最大值或最小值.但在数组中并没有提供arr.max()和arr.min()这样的方法.那么是不是可以通过别的方式实现类似这样的方法呢?那么今天我们就来整理取出数组中最 ...

  5. K:求取数组中最大连续子序列和的四个算法

    相关介绍:  求取数组中最大连续子序列和问题,是一个较为"古老"的一个问题.该问题的描述为,给定一个整型数组(当然浮点型也是可以的啦),求取其下标连续的子序列,且其和为该数组的所有 ...

  6. thinkphp session如何取数组

    thinkphp session如何取数组  session('user_auth.username'); 搞定!

  7. 取MAC地址 (含多网卡),最好的方法,支持Vista,Win7

    取MAC地址 (含多网卡),最好的方法,支持Vista,Win7 unit Unit1; interface usesWindows, Messages, SysUtils, Variants, Cl ...

  8. [Contract] Solidity address payable 转换与数组地址

    address payable  -->  address address payable addr1 = msg.sender; address addr2 = addr1; // 隐式转 a ...

  9. Powershell-获取MAC地址对应IP信息

    因业务需要在DHCP服务器上绑定设备MAC,提示"指定的IP地址或硬件地址正被其他客户端使用",与业务同事沟通之前该设备做过地址保留,具体对应地址遗忘了. 问题描述: a.按照用户 ...

随机推荐

  1. C++Primer笔记(3)

    标准库类型string表示可变长的字符序列,使用前先包含string头文件.(哈哈,终于可以逃脱C语言中的str函数系列了.)因为是标准库的一部分,所以string被定义在命名空间std中.所以你懂该 ...

  2. LeetCode-Divdend two Integers

    题目: Divide two integers without using multiplication, division and mod operator. 思路分析 二分法.将除数不断增倍,而结 ...

  3. 使用MSSM管理工具登录LOCALDB

    调试程序没有安装 sql server时,可以使用localdb.这是一个简易的sql server数据库,用于本地测试是很方便,省去安装SQL SERVER的工作 电脑上安装了VS2013 VS20 ...

  4. Kendo Web UI Grid数据绑定,删除,编辑,并把默认英文改成中文

    Kendo Web UI 是个不错的Jquery框.可惜老外写的,很多都是默认的英文,当然我们也可以设置成中文,接下来,我们就看看Grid是如何实现的数据绑定(Kendo Grid数据绑定实现有很多方 ...

  5. MySQL查看当前连接数、连接数和最大连接数

    MySQL查看当前所有连接的详细资料: mysqladmin -u root -p processlist MySQL查看当前连接数(Threads为连接数) mysqladmin -u root - ...

  6. [POJ] 2785 4 Values whose Sum is 0(双向搜索)

    题目地址:http://poj.org/problem?id=2785 #include<cstdio> #include<iostream> #include<stri ...

  7. CloudStack API编程指引

    原文地址:https://cwiki.apache.org/confluence/display/CLOUDSTACK/CloudStack+API+Coding+Guidelines 前言 本文阐述 ...

  8. 串口屏之------Usart GPU 使用手册

    Usart GPU 使用手册 文档更新日期 更新内容 2014-9-10 C编程sprintf问题 2014-8-8 版本程序1.0,升级了自定义波特率部分 ------ 原始版本 第一部分:基础应用 ...

  9. 迁移笔记:php截取文字的方法

    php内置函数 1. iconv iconv_set_encoding('internal_encoding', 'UTF-8'); $str; //字符串的声明 $num=iconv_strlen( ...

  10. Linux下SVN(Subversion)自动启动脚本

    在Red Hat  Linux中自动运行程序    1.开机启动时自动运行程序    Linux加载后, 它将初始化硬件和设备驱动,然后运行第一个进程init.init根据配置文件继续引导过程,启动其 ...