脑图如何发微信朋友圈如何发原图?

博客访问: 2384429
博文数量: 409
博客积分: 10227
博客等级: 上将
技术积分: 9516
注册时间:
认证徽章:
非淡泊无以明志,非宁静无以致远
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
char str[20], *
ptrstrptrstr
int a[10], *
Cp=&a[0]p=a
paapaaaaaa=10papapa=10
a[i]*(ai)<>[<>]*(<><>)**<>=<>C
c[i][j][k]*(*(*(ci)j)k)
int a[3][4];
*(*(p1)2)a[1][2]*pa[0][1]ppp1p2pa[0][1]
pjp=a[0]pa[0][1]a[1]p
\0\0ASCII0CC
void func(int A[])
&&&&& //sizeof(A)4bytes
int main()
&&& int a[10]; //sizeof(a) 40bytes
&&& funct(a);
&& int intArray[10];
&& intArray++;
WIN32sizeof4
sizeofsizeof(int)sizeofC/C++int""
char a[3] = "abc";
strcopy(a,"end");
-------------------
-----------------
char *a = "abc";
strcopy(a,"end");
------------------
char *a = "abc"; &abca
strcpy(a, "end")a
char *a = new char[4];
strcpy(a, "end");&&
printf("%s", a);
delete []a;
4//main.cpp
int array[3] = {7, 8, 9}; //
int main()
//Test1.cpp
extern int array[3];
void Test1()
cout << array[1] <<
//Test2.cpp
extern int * //
void Test2()
cout << array <<
cout << array[1] <<
Test1()Test2()
Test27 Test1()
Test1.cppexternarraymain.cpparrayint i = 5;50x8291
5i0x8291ii
Test1.cpparrayarray,0x34fearray == &arrayTest2.cpparray,0x34fearrayarray = 0x0007(,)
Test2()array[1]0x0007
char *p= "hello ";
,(section) "hello ",(, char *q= "hello ",p)
char a[]= "hello ";
,(section),
char *p= "hello ";
,(section) "hello ",(, char *q= "hello ",p),,,,,.
char a[]= "hello ";
printf( "%s\n ", "hello ");
( "%s\n " "hello "),
,char*p= "xxx ".
阅读(11079) | 评论(2) | 转发(7) |
相关热门文章
给主人留下些什么吧!~~
这个下面的解释没怎么理解。因为如果在main函数中定义一个int&*p=来操作,是完全没有问题的。
4//main.cppint&array[3]&=&{7,&8,&9};&//全局变量int&main(){Test1();Test2();return&0;}//Test1.cppextern&int&array[3];void&Test1(){cout&&&&array[1]&&&&}//Test2.cppextern&int&*&//这个地方是不同的void&Test2(){cout&&&&array&&&&cout&&&&array[1]&&&&}这个下面的解释没怎么理解。因为如果在main函数中定义一个int&*p=来操作,是
请登录后评论。(window.slotbydup = window.slotbydup || []).push({
id: '1102523',
container: s,
size: '180,30',
display: 'inlay-fix'
C语言数组指针和指向数组的指针变量—数组名作函数参数
发布日期: 09:30
来源:佚名
&数组名可以作函数的实参和形参。如:main(){int array[10];&& ……&& ……&f(array,10);……&&& ……}&f(int arr[],int n);&&&& {……&&& ……}array为实参数组名,arr为形参数组名。在学习指针变量之后就更容易理解这个问题了。数组名就是数组的首地址,实参向形参传送数组名实际上就是传送数组的地址,形参得到该地址后也指向同一数组。这就好象同一件物品有两个彼此不同的名称一样。&&& 同样,指针变量的值也是地址,数组指针变量的值即为数组的首地址,当然也可作为函数的参数使用。【例10.15】float aver(float *pa);main(){& float sco[5],av,*&& sp=& printf(&\ninput 5 scores:\n&);& for(i=0;i&5;i++) scanf(&%f&,&sco[i]);& av=aver(sp);& printf(&average score is %5.2f&,av);}float aver(float *pa){&& float av,s=0;& for(i=0;i&5;i++) s=s+*pa++;& av=s/5;&}【例10.16】将数组a中的n个整数按相反顺序存放。算法为:将a[0]与a[n-1]对换,再a[1]与a[n-2] 对换……,直到将a[(n-1/2)]与a[n-int((n-1)/2)]对换。今用循环处理此问题,设两个“位置指示变量”i和j,i的初值为0,j的初值为n-1。将a[i]与a[j]交换,然后使i的值加1,j的值减1,再将a[i]与a[j]交换,直到i=(n-1)/2为止,如图所示。程序如下:void inv(int x[],int n)&& /*形参x是数组名*/{&int temp,i,j,m=(n-1)/2;&for(i=0;i&=m;i++){j=n-1-i;&& temp=x[i];x[i]=x[j];x[j]=}&}main(){int i,a[10]={3,7,9,11,0,6,7,5,4,2};&printf(&The original array:\n&);&for(i=0;i&10;i++)&& printf(&%d,&,a[i]);&printf(&\n&);&inv(a,10);&printf(&The array has benn inverted:\n&);&for(i=0;i&10;i++)& printf(&%d,&,a[i]);&printf(&\n&);}对此程序可以作一些改动。将函数inv中的形参x改成指针变量。【例10.17】对例10.16可以作一些改动。将函数inv中的形参x改成指针变量。程序如下:void inv(int *x,int n)&& /*形参x为指针变量*/{&int *p,temp,*i,*j,m=(n-1)/2;&i=x;j=x+n-1;p=x+m;&for(;i&=p;i++,j--){temp=*i;*i=*j;*j=}&}main(){int i,a[10]={3,7,9,11,0,6,7,5,4,2};&printf(&The original array:\n&);&for(i=0;i&10;i++)&& printf(&%d,&,a[i]);&printf(&\n&);&inv(a,10);&printf(&The array has benn inverted:\n&);&for(i=0;i&10;i++)& printf(&%d,&,a[i]);&printf(&\n&);}运行情况与前一程序相同。【例10.18】从0个数中找出其中最大值和最小值。调用一个函数只能得到一个返回值,今用全局变量在函数之间“传递”数据。程序如下:int max,&&&&& /*全局变量*/void max_min_value(int array[],int n){int *p,*array_&array_end=array+n;&max=min=*&for(p=array+1;p&array_p++)&& if(*p&max)max=*p;&& else if (*p&min)min=*p;&}main(){int i,number[10];&printf(&enter 10 integer umbers:\n&);&for(i=0;i&10;i++)&& scanf(&%d&,&number[i]);&max_min_value(number,10);&printf(&\nmax=%d,min=%d\n&,max,min);&}说明:在函数max_min_value中求出的最大值和最小值放在max和min中。由于它们是全局,因此在主函数中可以直接使用。函数max_min_value中的语句:max=min=*array是数组名,它接收从实参传来的数组numuber的首地址。*array相当于*(&array[0])。上述语句与 max=min=array[0];等价。在执行for循环时,p的初值为array+1,也就是使p指向array[1]。以后每次执行p++,使p指向下一个元素。每次将*p和max与min比较。将大者放入max,小者放min。函数max_min_value的形参array可以改为指针变量类型。实参也可以不用数组名,而用指针变量传递地址。【例10.19】程序可改为:int max,&&&&& /*全局变量*/void max_min_value(int *array,int n){int *p,*array_&array_end=array+n;&max=min=*&for(p=array+1;p&array_p++)&& if(*p&max)max=*p;&& else if (*p&min)min=*p;&}main(){int i,number[10],*p;&p=&&&&&&&&&&&& /*使p指向number数组*/&printf(&enter 10 integer umbers:\n&);&for(i=0;i&10;i++,p++)&& scanf(&%d&,p);&p=&max_min_value(p,10);&printf(&\nmax=%d,min=%d\n&,max,min);&}归纳起来,如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参的对应关系有以下4种:形参和实参都是数组名。main(){int a[10];& ……&f(a,10)& ……f(int x[],int n){&……}}a和x指的是同一组数组。实用数组,形参用指针变量。main(){int a[10];& ……&f(a,10)& ……f(int *x,int n){&……}}实参、型参都用指针变量。实参为指针变量,型参为数组名。【例10.20】用实参指针变量改写将n个整数按相反顺序存放。void inv(int *x,int n){int *p,m,temp,*i,*j;&m=(n-1)/2;&i=x;j=x+n-1;p=x+m;&for(;i&=p;i++,j--)&& {temp=*i;*i=*j;*j=}&}main(){int i,arr[10]={3,7,9,11,0,6,7,5,4,2},*p;&p=&printf(&The original array:\n&);&for(i=0;i&10;i++,p++)&& printf(&%d,&,*p);&printf(&\n&);&p=&inv(p,10);&printf(&The array has benn inverted:\n&);&for(p=p&arr+10;p++)& printf(&%d,&,*p);&printf(&\n&);}注意:main函数中的指针变量p是有确定值的。即如果用指针变作实参,必须现使指针变量有确定值,指向一个已定义的数组。【例10.21】用选择法对10个整数排序。main(){int *p,i,a[10]={3,7,9,11,0,6,7,5,4,2};&printf(&The original array:\n&);&for(i=0;i&10;i++)&& printf(&%d,&,a[i]);&printf(&\n&);&p=a;&sort(p,10);&for(p=a,i=0;i&10;i++)& {printf(&%d& &,*p);p++;}&printf(&\n&);}sort(int x[],int n){int i,j,k,t;&for(i=0;i&n-1;i++)&& {k=i;&&& for(j=i+1;j&n;j++)&&&&& if(x[j]&x[k])k=j;&&& if(k!=i)&&& {t=x[i];x[i]=x[k];x[k]=t;}&&& }}说明:函数sort用数组名作为形参,也可改为用指针变量,这时函数的首部可以改为:sort(int *x,int n) 其他可一律不改。&
(window.slotbydup = window.slotbydup || []).push({
id: '1063561',
container: s,
size: '230,230',
display: 'inlay-fix'
C语言是一种计算机程序设计语言。它既有高级语言的特点,又具有汇编语言的特点。它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。本教程讲从C语言概述,C语言算法,数据类型、运算符,顺序程序设计,分支结构等知识来学习C语言程序设计。
免责声明:以上教程信息由会员自行搜集、整理、发布,内容的真实性、准确性和合法性由发布会员负责。站长学院对此不承担任何责任。一下飞机就有亲切感,“我真的有记忆,来过这里。”
留下三个未成年孩子和一对需要长期吃药的古稀老人。
声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
  指针(Pointer)就是内存的地址,C语言允许用一个变量来存放指针,这种变量称为指针变量。指针变量可以存放基本类型数据的地址,也可以存放数组、函数以及其他指针变量的地址。
  程序在运行过程中需要的是数据和指令的地址,变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符:在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址;程序被编译和链接后,这些名字都会消失,取而代之的是它们对应的地址。
常见指针变量的定义
p 可以指向 int 类型的数据,也可以指向类似 int arr[n] 的数组。
p 为二级指针,指向 int * 类型的数据。
int *p[n];
p 为指针数组。[ ] 的优先级高于 *,所以应该理解为 int *(p[n]);
int (*p)[n];
p 为二维数组指针。
p 是一个函数,它的返回值类型为 int *。
int (*p)();
p 是一个函数指针,指向原型为 int func() 的函数。
  1) 指针变量可以进行加减运算,例如p++、p+i、p-=i。指针变量的加减运算并不是简单的加上或减去一个整数,而是跟指针指向的数据类型有关。
  2) 给指针变量赋值时,要将一份数据的地址赋给它,不能直接赋给一个整数,例如int *p = 1000;是没有意义的,使用过程中一般会导致程序崩溃。
  3) 使用指针变量之前一定要初始化,否则就不能确定指针指向哪里,如果它指向的内存没有使用权限,程序就崩溃了。对于暂时没有指向的指针,建议赋值NULL。
  4) 两个指针变量可以相减。如果两个指针变量指向同一个数组中的某个元素,那么相减的结果就是两个指针之间相差的元素个数。
  5) 数组也是有类型的,数组名的本意是表示一组类型相同的数据。在定义数组时,或者和 sizeof、& 运算符一起使用时数组名才表示整个数组,表达式中的数组名会被转换为一个指向数组的指针。
长按二维码识别关注
  电子路上与你同行!
欢迎举报抄袭、转载、暴力色情及含有欺诈和虚假信息的不良文章。
请先登录再操作
请先登录再操作
微信扫一扫分享至朋友圈
搜狐公众平台官方账号
生活时尚&搭配博主 /生活时尚自媒体 /时尚类书籍作者
搜狐网教育频道官方账号
全球最大华文占星网站-专业研究星座命理及测算服务机构
主演:黄晓明/陈乔恩/乔任梁/谢君豪/吕佳容/戚迹
主演:陈晓/陈妍希/张馨予/杨明娜/毛晓彤/孙耀琦
主演:陈键锋/李依晓/张迪/郑亦桐/张明明/何彦霓
主演:尚格?云顿/乔?弗拉尼甘/Bianca Bree
主演:艾斯?库珀/ 查宁?塔图姆/ 乔纳?希尔
baby14岁写真曝光
李冰冰向成龙撒娇争宠
李湘遭闺蜜曝光旧爱
美女模特教老板走秀
曝搬砖男神奇葩择偶观
柳岩被迫成赚钱工具
大屁小P虐心恋
匆匆那年大结局
乔杉遭粉丝骚扰
男闺蜜的尴尬初夜
客服热线:86-10-
客服邮箱:数组指针和指针数组的区别 - jack_Meng - 博客园
随笔 - 692, 文章 - 1, 评论 - 91, 引用 - 0
数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。&p=a;&&&&&&& //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]&p++;&&&&&& //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
所以数组指针也称指向一维数组的指针,亦称行指针。
指针数组定义 int *p[n];[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。如要将二维数组赋给一指针数组:int *p[3];int a[3][4];p++;&//该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针for(i=0;i&3;i++)p[i]=a[i]这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]所以要分别赋值。
这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。比如要表示数组中i行j列一个元素:*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]
优先级:()&[]&*
=========================================================================
一、指针数组和数组指针的内存布局
初学者总是分不出指针数组与数组指针的区别。其实很好理解:指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定,每一个元素都是一个指针,在32 位系统下任何类型的指针永远是占4 个字节。它是&储存指针的数组&的简称。数组指针:首先它是一个指针,它指向一个数组。在32 位系统下任何类型的指针永远是占4 个字节,至于它指向的数组占多少字节,不知道,具体要看数组大小。它是&指向数组的指针&的简称。下面到底哪个是数组指针,哪个是指针数组呢:A)int *p1[10];B)int (*p2)[10];每次上课问这个问题,总有弄不清楚的。这里需要明白一个符号之间的优先级问题。&[]&的优先级比&*&要高。p1 先与&[]&结合,构成一个数组的定义,数组名为p1,int *修饰的是数组的内容,即数组的每个元素。那现在我们清楚,这是一个数组,其包含10 个指向int 类型数据的指针,即指针数组。至于p2 就更好理解了,在这里&()&的优先级比&[]&高,&*&号和p2 构成一个指针的定义,指针变量名为p2,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。那现在我们清楚p2 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针。我们可以借助下面的图加深理解:
二、int (*)[10] p2-----也许应该这么定义数组指针
这里有个有意思的话题值得探讨一下:平时我们定义指针不都是在数据类型后面加上指针变量名么?这个指针p2 的定义怎么不是按照这个语法来定义的呢?也许我们应该这样来定义p2:& &int (*)[10] p2;int (*)[10]是指针类型,p2 是指针变量。这样看起来的确不错,不过就是样子有些别扭。其实数组指针的原型确实就是这样子的,只不过为了方便与好看把指针变量p2 前移了而已。你私下完全可以这么理解这点。虽然编译器不这么想。^_^
三、再论a 和&a 之间的区别
既然这样,那问题就来了。前面我们讲过a 和&a 之间的区别,现在再来看看下面的代码:int main(){& &char a[5]={'A','B','C','D'};& &char (*p3)[5] = &a;& &char (*p4)[5] =& &return 0;}上面对p3 和p4 的使用,哪个正确呢?p3+1 的值会是什么?p4+1 的值又会是什么?毫无疑问,p3 和p4 都是数组指针,指向的是整个数组。&a 是整个数组的首地址,a是数组首元素的首地址,其值相同但意义不同。在C 语言里,赋值符号&=&号两边的数据类型必须是相同的,如果不同需要显示或隐式的类型转换。p3 这个定义的&=&号两边的数据类型完全一致,而p4 这个定义的&=&号两边的数据类型就不一致了。左边的类型是指向整个数组的指针,右边的数据类型是指向单个字符的指针。在Visual C++6.0 上给出如下警告:& &warning C4047: 'initializing' : 'char (*)[5]' differs in levels of indirection from 'char *'。还好,这里虽然给出了警告,但由于&a 和a 的值一样,而变量作为右值时编译器只是取变量的值,所以运行并没有什么问题。不过我仍然警告你别这么用。既然现在清楚了p3 和p4 都是指向整个数组的,那p3+1 和p4+1 的值就很好理解了。但是如果修改一下代码,把数组大小改小点,会有什么问题?p3+1 和p4+1 的值又是多少呢?int main(){& &char a[5]={'A','B','C','D'};& &char (*p3)[3] = &a;& &char (*p4)[3] =& &return 0;}甚至还可以把代码再修改,把数组大小改大点:int main(){& &char a[5]={'A','B','C','D'};& &char (*p3)[10] = &a;& &char (*p4)[10] =& &return 0;}这个时候又会有什么样的问题?p3+1 和p4+1 的值又是多少?上述几个问题,希望读者能仔细考虑考虑,并且上机测试看看结果。
(1).char (*p2)[5]=a;必须使用强制转换,如:char (*p2)[5]=(char (*)[5])a;
(2).把数组大小改变,都会编译不通过,提示:
error C2440: 'initializing' : cannot convert from 'char (*)[5]' to 'char (*)[3]'
error C2440: 'initializing' : cannot convert from 'char (*)[5]' to 'char (*)[10]'
(3).把以上程序测试代码如下:
int main()
&& char a[5]={'a','b','c','d'};
&& char (*p1)[5]= &a;
&& char (*p2)[5]=(char (*)[5])a;
&& printf("a=%d\n",a);
&& printf("a=%c\n",a[0]);
&& printf("p1=%c\n",**p1);
&& printf("p2=%c\n",**p2);
&& printf("p1+1=%c\n",**(p1+1));
&& printf("p2+1=%c\n",**(p2+1));
&& return 0;
Press any key to continue
根据指针类型及所指对象,表示指针大小,每次加1,表示增加指针类型大小的字节.----后面还会有解释说明.
四、地址的强制转换
先看下面这个例子:struct Test{& &int N& &char *pcN& &short sD& &char cha[2];& &short sBa[4];}*p;假设p 的值为0x100000。如下表表达式的值分别为多少?& &p + 0x1 = 0x___ ?& &(unsigned long)p + 0x1 = 0x___?& &(unsigned int*)p + 0x1 = 0x___?我相信会有很多人一开始没看明白这个问题是什么意思。其实我们再仔细看看,这个知识点似曾相识。一个指针变量与一个整数相加减,到底该怎么解析呢?还记得前面我们的表达式&a+1&与&&a+1&之间的区别吗?其实这里也一样。指针变量与一个整数相加减并不是用指针变量里的地址直接加减这个整数。这个整数的单位不是byte 而是元素的个数。所以:p + 0x1 的值为0x100000+sizof(Test)*0x1。至于此结构体的大小为20byte,前面的章节已经详细讲解过。所以p +0x1 的值为:0x100014。(unsigned long)p + 0x1 的值呢?这里涉及到强制转换,将指针变量p 保存的值强制转换成无符号的长整型数。任何数值一旦被强制转换,其类型就改变了。所以这个表达式其实就是一个无符号的长整型数加上另一个整数。所以其值为:0x100001。(unsigned int*)p + 0x1 的值呢?这里的p 被强制转换成一个指向无符号整型的指针。所以其值为:0x100000+sizof(unsigned int)*0x1,等于0x100004。上面这个问题似乎还没啥技术含量,下面就来个有技术含量的:在x86 系统下,其值为多少?intmain(){& &int a[4]={1,2,3,4};& &int *ptr1=(int *)(&a+1);//指向a数组后面的内存单元,&a+1表示向后移16个存储单元&&&int *ptr2=(int *)((int)a+1);//表示a的存储单元的地址增加一个字节& &printf("%x,%x",ptr1[-1],*ptr2);//ptr1[-1]其实指向的是a数组的最后一个单元,*ptr1则表示a数组的地址后移一个字节之后的4个连续存储单元所存储的值&&&return 0;}这是我讲课时一个学生问我的题,他在网上看到的,据说难倒了n 个人。我看题之后告诉他,这些人肯定不懂汇编,一个懂汇编的人,这种题实在是小case。下面就来分析分析这个问题:根据上面的讲解,&a+1 与a+1 的区别已经清楚。ptr1:将&a+1 的值强制转换成int*类型,赋值给int* 类型的变量ptr,ptr1 肯定指到数组a 的下一个int 类型数据了。ptr1[-1]被解析成*(ptr1-1),即ptr1 往后退4 个byte。所以其值为0x4。ptr2:按照上面的讲解,(int)a+1 的值是元素a[0]的第二个字节的地址。然后把这个地址强制转换成int*类型的值赋给ptr2,也就是说*ptr2 的值应该为元素a[0]的第二个字节开始的连续4 个byte 的内容。其内存布局如下图:
好,问题就来了,这连续4 个byte 里到底存了什么东西呢?也就是说元素a[0],a[1]里面的值到底怎么存储的。这就涉及到系统的大小端模式了,如果懂汇编的话,这根本就不是问题。既然不知道当前系统是什么模式,那就得想办法测试。大小端模式与测试的方法在第一章讲解union 关键字时已经详细讨论过了,请翻到彼处参看,这里就不再详述。我们可以用下面这个函数来测试当前系统的模式。
int&checkSystem()
&&union check
&&{& & & int&i;& & & char&
&&c.i = 1;
&&return (c.ch ==1);//如果当前系统为大端模式这个函数返回0;如果为小端模式,函数返回1。
如果当前系统为大端模式这个函数返回0;如果为小端模式,函数返回1。也就是说如果此函数的返回值为1 的话,*ptr2 的值为0x2000000。如果此函数的返回值为0 的话,*ptr2 的值为0x100。

我要回帖

更多关于 微信如何发朋友圈信息 的文章

 

随机推荐