数组和指针再次来袭

原创 2016年06月02日 10:45:19

1,数组和指针的定义于声明:

定义:只能出现一次,用来确定对象的类型和大小,并为其分配空间。

声明:可以出现多次,描述对象的类型,用于指定其他地方定义的对象,不为对象分配空间。

所以说extern char a[]与extern char a[10]等价,因为这是声明,不分配空间。

看一个关于数组指针的例子:

例1:

#include<stdio.h>
int main()
{
	char a[5] = { 'A', 'B', 'C', 'D' };
	char(*p3)[4] = &a;//这样的赋值不合理,数组a有5个元素,而p3是一个包含4个元素的数组指针。
	char(*p4)[5] = a;//p4用来存放数组地址,a代表数组首元素的地址,所以类型不匹配
	return 0;
}

如果将&a强制类型转换为(char (*)[4])&a后就可以赋值给char (*p)[4]了,p4+1相当于加了4个字节,而不是5,因为p4的大小为4。

例2:

#include<stdio.h>
#include<stdlib.h>
struct Test
{
	int Num;
	char *pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;
int main()
{
	struct Test test;//假设sizeof(struct Test)=20
	p = &test;
	printf("%x\n", p);
	printf("%x\n", p + 0x1);
	printf("%x\n", (unsigned long)p + 0x1);
	printf("%x\n", (unsigned int*)p + 0x1);
	system("pause");
	return 0;
}

wKiom1Zj8eWymj5NAAA0f8CUAM4486.png

结果分析:p的地址为1ef7f4,p里面存放的是结构体的地址,所以p+0x1就要加一个结构体的大小20,转换为16进制,结果就是1ef808。将p转化为无符号长整型,加1就是直接加十进制1,结果就是1ef7f5。将p转换为整型指针,占四个字节,加1就相当于加1*sizeof(int *),结果就是1ef7f8。

例3:vs2013中小端存储:

int main()
{
	int a[4] = { 1, 2, 3, 4 };
	int *ptr1 = (int *)(&a + 1);
	int *ptr2 = (int *)((int)a + 1);
	printf("%x,%x", ptr1[-1], *ptr2);
	system("pause");
	return 0;
}

wKiom1ZkBfbwLMXjAAAng-b5WQ8844.png

wKioL1ZkCADDVAe2AAAc-CVM4Tw298.png








本文出自 “Stand out or Get out” 博客,请务必保留此出处http://jiazhenzhen.blog.51cto.com/10781724/1720090

C语言中指针与数组的区别与联系

好久不写东西了,从毕业以来,整个人都懒散了很多。今天终于鼓起勇气,来写一点儿东西…… 指针与数组对于C语言程序员来说肯定不会陌生,一说起这个话题,我就想起了曾经被内存、地址、地址里的内容这些概念狂虐时...
  • cyfcsd
  • cyfcsd
  • 2017年02月03日 17:29
  • 4459

数组与指针关系

1
  • App_12062011
  • App_12062011
  • 2013年09月15日 20:25
  • 3336

C语言:数组和指针的区别

实际上关于数组与指针的区别这个问题在《C专家编程》已经有很详细的阐释,但我想用自己的语言说一说我的理解。数组是指针?最近在做数据结构课设,其中一个函数发生了令人费解的错误,简化后的代码如下:#incl...
  • imred
  • imred
  • 2015年05月02日 19:08
  • 13945

关于C语言你不知道的事(1)–指针和数组的区别

关于C语言你不知道的事(1)–指针和数组的区别 Table of Contents 1 一个很多人都会做错的面试题 2 数组与指针的差别 2.1 数组和指针是如何访问的 2.2 数组和指针可...
  • huangkangying
  • huangkangying
  • 2014年12月29日 21:59
  • 3580

C/C++数组和指针详解

/****************************************************************/ /*            学习是合作和分享式的! /* Au...
  • wdzxl198
  • wdzxl198
  • 2013年06月13日 16:16
  • 7067

指针,数组转换漫谈

先给出几个定义: int a [10] :即是说明 a 是一个连续的内存块,有10个结构,这个结构被看成 int 去解析。 int * b = a;即是说明 b 是一个内存块,有 1 个结构,这个...
  • lizhihaoweiwei
  • lizhihaoweiwei
  • 2014年07月19日 12:42
  • 1180

C语言指针与数组易混淆知识点(一)

一指针与数组 二指针与函数 三指针数组数组指针指向指针的指针 四程序陷阱 一、指针与数组指针:指针本身也是一个变量,它的内容是指向的内容的地址。指针同样有类型的区分,char 的指针只能指向char型...
  • woshimalingyi
  • woshimalingyi
  • 2016年03月25日 15:59
  • 3024

探讨下C++中的数组和指针的区别

最近一段时间在研究虚拟现实方面的内容,有一段时间没写代码,重拾C++,顺便记录下C++中容易出错的内容,数组和指针的区别。很多新手都抱怨说C++难,尤其是指针和数组,傻傻分不清楚,那么我就从我对数组和...
  • transferli
  • transferli
  • 2016年03月24日 13:04
  • 309

《C专家编程》:指针和数组的区别详解(四)

C语言编程新手常听到的说法之一就是“数组和指针是相同的”。不幸的是,这是一种非常危险的说法,并不完全正确。 一、什么是声明,什么是定义。 注意下面声明的区别: extern int...
  • gogoky
  • gogoky
  • 2016年05月24日 10:21
  • 1018

数组与指针间的转换浅析

可以允许把指针好像数组名一样进行标记 #define N 100 int a[N],i,sum=0,*p=a; for(i=0;i sum+=p[i]; 对待p[i]就像对待*(p+i)一样...
  • Moon_K_H
  • Moon_K_H
  • 2015年01月09日 22:35
  • 2322
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数组和指针再次来袭
举报原因:
原因补充:

(最多只允许输入30个字)