文档章节

幻境奇缘

N3verL4nd
 N3verL4nd
发布于 2017/03/25 10:42
字数 838
阅读 4
收藏 0
#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;
}



© 著作权归作者所有

N3verL4nd
粉丝 1
博文 379
码字总数 481243
作品 0
朝阳
私信 提问
10.21日常总结

10.21日常总结 总体情况 结论题没搞出结论,炸了;DP题看错数据范围,不敢打正解;第三题,又是真的没想到,做了一上午题挺颓废,其实可以拿的分又是没拿到。 T1 Deep 题目描述 失败的燃烧军...

leader_one
2017/10/30
0
0
儿童专用操作系统--Qimo

Qimo 是一个专门为 3 岁及以上年龄儿童设计的 Linux 发行版。它本身基于 Ubuntu,其中预装了具有教育性的游戏,这样或许可以达到寓教于乐的目的吧。Qimo 的界面很直观,采用大图标,且易于使...

匿名
2009/03/21
7.8K
1
听了一些怪异的 podcast,这里介绍两个。

/feng/ Dunc'd On 作者是加州两个前律师,现在全职播客手。内容是这哥两个通篇累椟的讨论 NBA 里面各种犄角旮旯的细节:某个三流球队的三流球员是不是被 undervalue? NBA 的合同中的某个法律...

峰哥BYM
2017/11/28
0
0
渲染3D动画时,用GPU还是CPU好?

从机器人总动员、疯狂动物城、超能陆战队、海底总动员、冰雪奇缘、无敌破坏王为代表的迪士尼经典动画片,对于动漫爱好者无一不反复看了多少遍了,现在一些国产三维影视动画也越来越牛逼,我们...

阿里云_云栖社区
2018/01/31
0
0
心中的火在焚尸的火中泯灭 | 峰哥讲童话《冰雪女王》

/feng/ The Snow Queen 是安徒生创作的童话之一。它特别之处在于,它是安徒生作品中最长的童话,由 7 个小故事构成。它同时是安徒生作品中的名篇,还被迪斯尼改编成一部动画片,叫「冰雪奇缘...

峰哥BYM
2017/12/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

作为一个(IT)程序员!聊天没有话题?试试这十二种技巧

首先呢?我是一名程序员,经常性和同事没话题。 因为每天都会有自己的任务要做,程序员对于其他行业来说;是相对来说比较忙的。你会经常看到程序员在发呆、调试密密麻麻代码、红色报错发呆;...

小英子wep
今天
15
0
【SpringBoot】产生背景及简介

一、SpringBoot介绍 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程,该框架使用了特定的方式来进行配置,从而使开发人员不再需要...

zw965
今天
5
0
简述并发编程分为三个核心问题:分工、同步、互斥。

总的来说,并发编程可以总结为三个核心问题:分工、同步、互斥。 所谓分工指的是如何高效地拆解任务并分配给线程,而同步指的是线程之间如何协作,互斥则是保证同一时刻只允许一个线程访问共...

dust8080
今天
6
0
OSChina 周四乱弹 —— 当你简历注水但还是找到了工作

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌 :#今日歌曲推荐# 分享成龙的单曲《男儿当自强》。 《男儿当自强》- 成龙 手机党少年们想听歌,请使劲儿戳(这里) @hxg2016 :刚在...

小小编辑
今天
3.4K
22
靠写代码赚钱的一些门路

作者 @mezod 译者 @josephchang10 如今,通过自己的代码去赚钱变得越来越简单,不过对很多人来说依然还是很难,因为他们不知道有哪些门路。 今天给大家分享一个精彩的 GitHub 库,这个库整理...

高级农民工
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部