#include<stdio.h>
#include<string.h>
int main()
{
char p[] = "1234567890";
char *ppp = p;
for(int i = 0; i < strlen(ppp); i++)
{
printf("%d", i);
ppp++;
}
}
输出结果:01234
#include<stdio.h>
#include<string.h>
int main()
{
char p[] = "1234567890";
char *ppp = p;
for(int i = 0; i < strlen(ppp); i++)
{
printf("%d %c\n", i,ppp[i]);
ppp++;
}
}
i |
ppp[i] |
0 |
1 |
1 |
3 |
2 |
5 |
3 |
7 |
4 |
9 |
int a[5]={1,2,3,4,5};
int *p1=(int*)(&a+1);
int *p2=(int*)((int)a+1);
int *p3=(int*)(&a)+1;
// p3=p3+1;
printf("%x,%x,%x",p1[-1],*p2,p3[-1]);
输出结果:5,2000000,1
首先说一下关于对数组名取地址:
关于对数组名取地址的问题,由于数组名是右值,本来&array 是不合法的,早期不少编译器就是指定&array 是非法的,但后来C89/C99认为数组符合对象的语义,对一个对象取地址是合理的,因此,从维护对象的完整性出发,也允许&array 。只不过,&array 的意义并非对一个数组名取地址,而是对一个数组对象取地址,也正因为如此,array 才跟&array 所代表的地址值一样,同时sizeof(array )应该跟sizeof(&array )一样,因为sizeof(&array )代表取一个数组对象的长度。
要注意到 array 和 &array 的类型是不同的。array为一个指针,而&array是指向数组int [100]的指针。array 相当于 &array[0],而 &array 是一个指向 int[100] 的指针,类型是 int(*)[100]。
另外从步长的角度分析这个问题
执行如下语句:
printf("array=%p, array+1=%p/n", array, array+1);
printf("&array=%p, &array+1=%p/n", &array, &array+1);
结果为:
array=0012FDF0, array+1=0012FDF4 //+sizeof(int)
&array=0012FDF0, &array+1=0012FF80 //+sizeof(&array)
在《C专家编程》书中关于数组一章P203,有如下解释:
无论指针还是数组,在连续的内存地址上移动时,编译器都必须计算每次前进的步长。
编译器自动把下标值调整到数组元素大小,对起始地址进行加法操作之前,编译器都会负责计算每次增加的步长,这就是为什么指针类型总是有类型限制,每个指针只能指向一种类型的原因所在,因为编译器需要知道对指针进行解除引用操作时应该取几个字节,以及每个小标的步长应取几个字节。
另外步长的自动调整还和上下语句相关:
int *p3=(int*)(&a);
p3=p3+1;
首先对P3指针变量赋初值,指向数组int [5]的指针,然后对指针进行加一的操作,其中P3定义为一个指向int类型的指针,因此最终P3的值等价P3+sizeof(int)
int *p3=(int*)(&array+1);
&array+1,步长为1,其中步长的长度和&array的类型匹配,即&array是指向数组int [100]的指针,所以&array+1等价为&array+sizeof(&array)
最终p1[-1]等价为*(P1-1),因此等价为第二个int [5]的数据首地址(并不存在第二个数组显然当前指针已经越界了,另外数组元素在内存中是连续存贮的)减去一个为sizeof(int)的步长,所以指向了第一个数组的最后1个元素。
#include <stdio.h>
int a[2] = {1,2};
int main(){
printf("a = %p\n", a); // I
printf("&a = %p\n", &a); // II
printf("a + 1 = %p\n", a + 1);// III
printf("&a + 1 = %p\n", &a + 1);// IV
return 0;
}
分享到:
相关推荐
《幻境网盾:局域网限速软件的深度解析》 幻境网盾是一款针对局域网环境设计的专业限速软件,其V3.5 (Skiller) 简体中文VIP版更是集成了诸多高级功能,为网络管理提供了强大而简便的工具。在这款软件中,用户不仅...
【幻境网盾3.5:一款出色的限速工具】 幻境网盾3.5是一款在IT领域中被广泛使用的网络限速工具,其稳定性和高效性是它的一大亮点。这款软件的主要功能在于帮助用户管理和控制网络流量,尤其是在网络环境复杂、多用户...
《幻境网盾3.6与3.7:探索网络安全的新境界》 在数字化日益普及的今天,网络安全已经成为我们生活中不可或缺的一部分。"幻境网盾"作为一款备受瞩目的限速软件,以其卓越的性能和稳定性赢得了广大用户的青睐。本文将...
### 幻境网盾安装指南:深度解析与关键知识点 #### 一、幻境网盾简介 幻境网盾是一款专业级网络安全防护软件,旨在为用户提供全面的网络环境监控、安全防护以及网络优化功能。其核心特性包括了ARP攻击防御、远程...
"幻境网盾Skiller 3.50"是一款针对局域网环境设计的网络管理软件,主要用于控制网络上的各种活动。这款工具以其强大的功能和易用性在用户中受到一定的欢迎。其主要功能集中在对局域网内设备的监控和限制,尤其是对于...
幻境网盾V3.7绿色免费版幻境网盾V3.7绿色免费版幻境网盾V3.7绿色免费版幻境网盾V3.7绿色免费版幻境网盾V3.7绿色免费版幻境网盾V3.7绿色免费版
幻境拨号精灵 幻境拨号精灵 幻境拨号精灵
幻境网盾 3.5 突破ARP防火墙,达到限制网速 仅限于有线局域网
幻境网盾——局域网限速工具,原名SKILLER,因原cncert团队并入80sec,新版的幻境网盾版权由80SEC所有。是一款可突破任意ARP防火墙,以限制流量为目标的简单网络管理软件,幻境网盾不是基于ARP欺骗包原理,它集成了...
【幻境网盾:网络管理工具的解析】 幻境网盾是一款主要用于网络管理的软件,其核心功能在于能够限制他人或特定设备的网络速度。在企业、学校等网络环境中,这种工具的应用尤为常见,旨在保障网络资源的合理分配,...
《火域幻境》是一款独具魅力的游戏艺术作品,它在国际程序设计大赛中脱颖而出,以其卓越的视觉表现力和创新的编程技术赢得了人们的赞誉。尽管其文件大小达到了73.0 KB,超出了传统64K游戏的范畴,但这款作品的精妙之...
幻境网盾3.7,一款可突破防火墙的流量限制软件。
幻境网盾主要功能: 1.流量探测 3.7为减缓蓝屏在流量探测稍作改动,影响到了部分环境下的流量探测能力。如果不蓝屏的用户可以使用旧版本的skiller。 2.能够自主使用代理 不用担心,程序会自动使用代理。 3.无线网卡...
《幻境拨号精灵[2.0]:高效便捷的大学生自制拨号软件》 幻境拨号精灵[2.0]是一款专为大学生设计的高效拨号软件,以其小巧的体积和出色的性能赢得了用户的喜爱。这款软件的核心功能在于实现一人拨号,全寝室共享上网...
幻境网盾使用方法:本工具的安装需要.net2.0以上和winpcap4.0 1.在参数设置中选择好工作网卡; 2.检查网关信息和本机信息是否正确,如果不正确,请手动输入,无需保存; 3.点击流量探测或手动添加或自动扫描以...
幻境网盾——局域网限速工具,原名:SKILLER,内含Winpcap,下载后先安装Winpcap和.Net frame work2.0,再运行幻境网盾4.7。主要用于限制局域网内其它计算机的网速。以提高自身计算机网速。 本人已经试过,以前在涟...
幻境网盾(Skiller)3.5,3.6,3.7发布汇总
"幻境大师插件"是一款专为创建海洋、天空、山体地形等环境效果而设计的强大工具,尤其在3D建模与渲染领域中极为实用。这款插件以其易用性和高效性闻名,使得即便是初学者也能快速掌握并创造出令人惊叹的虚拟场景。 ...
【幻境网盾3.7版】是一款专为局域网设计的管理工具,它的主要功能在于帮助网络管理员监控和管理内部网络中的设备活动。这款软件的独特之处在于它能够有效地限制局域网内其他计算机的网络连接,尤其适用于识别并控制...
这是我的百度云网盘链接,里面有各种版本http://pan.baidu.com/s/1j8kvY