C++数组和指针加减法和sizeof问题

关于指针和加减法:

指针的加减法:指针的加减法,加多少或者减多少,主要是看所指对象的sizeof值

例子:

    double m = 3.0;
    int n = 3;
    double *p=&m;
    int* p1=&n;

    printf("p:%d\n", p );
    printf("P+1:%d\n", p+1);
    printf("P1:%d\n", p1);
    printf("P1+1:%d\n", p1+1);    

如上图所示,p加了8,因为指向是double类型。p1加了4,因为指向了int。

现在我定义一个数组,int a[3]={0};看一下a+1和&a+1到底加了多少:

    int p[3] = { 0 };

    printf("p:%d\n", p);
    printf("P+1:%d\n", p + 1);

    printf("&p:%d\n", &p);
    printf("&p+1:%d\n", &p+1);

p+1加了4,&p+1加了12。

此时p指向的是数组的第一个元素,而&p指向的一个大小为3的int数组。因此p+1加的是一个int的大小,而&p+1加的是一个int[3]数组的大小12。

关于类型和sizeof:

虽然如此,但是p的类型是数组,&p的类型是指针。

int (*p1)[3]=&p;

p1和&p的类型都是指向int [3]的指针,而p的类型就是一个int[3]的数组。PS:数组在作为参数的时候退化为一个指针。

而sizeof主要是根据变量的类型,因此指针大小自然为4,p的大小是12。

时间: 2024-10-05 05:11:55

C++数组和指针加减法和sizeof问题的相关文章

二维树状数组的区间加减及查询 tyvj 1716 上帝造题的七分钟

具体解释见小结.http://blog.csdn.net/zmx354/article/details/31740985 #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <cmath> #include <stack>

指针加减操作

正确的输出结果为: 分析:首先,a与&a的地址是一样的,但含义不一样. a是数组元素的首地址,即a[0]的首地址:&a是数组的首地址,即整个数组的首地址. 区别在于,a+1表示数组下一个元素的地址,即a[1]的地址:而&a+1表示下一个对象(数组)的首地址.换而言之,就是在做指针的加减法的时候,地址偏移量的单位是不一样的,前者的偏移量单位是元素,后者的偏移量单位是对象. 其次,sizeof(a)和sizeof(&a)的区别, sizeof(a)是把a作为一个数组类型来测试,

关于指针的加减操作

原题: main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); } 程序输出是什么. 解答: 程序输出: 2,5 分析: 这里主要是考查关于指针加减操作的理解. 对指针进行加1操作,得到的是下一个元素的地址,而不是原有地址值直接加1.所以,一个类型为 T 的指针的移动,以 sizeof(T) 为移动单位. 因此,对上题来说,a是一个一维数组,数组中有5个元素:

sizeof 数组与指针

在学习指针的时候,得到指针的定义和数组的定义一样,但是这时候就很好奇,指针只是一个地址,那数组和指针一样的话,sizeof时怎么得知其长度呢. 于是百度了下面的回复: 千万不要把数组名看成指针,尽管有些时候他们是相通的,但也仅限某些时候而已. sizeof是一个奇特的函数,告诉你你也许不相信——sizeof在编译的时候就已经确定sizeof的结果了,这有点类似于宏. char str[] = “Hello” ; sizeof (str ) = 6 编译器编译的时候根据上下文完全知道str是一个数

C语言(八)---数组与指针

一.数组的概念 1.1 数组 数组是一组具有相同数据类型的有序变量的集合,在内存中表现为一块连续的存储区域. 1.2 数组的定义 数组定义:在普通变量定义后加[常量] 类型标识符 数组名[常量表达式] 错误:[变量]:error C2057: expected constant expression 1.3 数组的初始化 数组初始化:用{}给数组赋予初值 初始化元素的个数可以不全.(用1个到总数个常量和变量) 未初始化全,把其余的归零. 数组清零:char array[10] = {0}; 不指

C的日记-数组和指针

[数组] C语言中数组名表示该数组的起始地址,即给数组本身对应的值就是一个地址,而数组中的值就是从起始地址开始的不同的地址内的值. 如:char c[9];        //定义时的数组char c[5]中的c和运算时的c是一个含义,都是数组首地址     scanf("%s",c);     printf("%d",c); // printf(%s,c) 输入:china 输出:2686675.输出的是字符数组首地址. 若换为后面一个,输出china,输出chi

【c语言】strlen与sizeof对数组和指针的求法

// strlen与sizeof对数组和指针的求法 #include <stdio.h> #include <string.h> int main() { char *pcColor = "12345678"; char acColor[] = "12345678"; printf("%d\n", strlen(pcColor));//8 求字符串的大小 printf("%d\n", strlen(ac

C语言中的sizeof中的数组和指针

1.引子 今日在看动态规划的0-1背包问题,看完后还是打算自己写着试试,毕竟实践才能出真知嘛.动态规划的结果是个二维数组dp,我copy书上的例子进行初始 memset(dp,0,sizeof(dp)),考虑到程序的健壮性,对于数组我都是用的动态申请,自然二维数组也不例外[动态二维数组的建立可参见本blog的延伸]. 程序写完后,但是却不能运行,开始单步调试,当进行到dp的赋值时老是报指针的错误!!!开始我以为是指针越界什么的,仔细才发现dp的数组维数确实要多申请一个用来存放初始情况的值(全是0

代码练习(二维数组的定义,字符串加减,子元素的创建及绑定,排序算法)

<!DOCTYPE> <html> <head> <meta charset="utf-8"> <title>IFE JavaScript Task 01</title> </head> <body> <ul id="source"> <li>北京空气质量:<b>90</b></li> <li>上海空