东莞fun88网作为国内成立最早、规模最大的IT职业教育机构和北京大...
嘉华职业教育东莞金码校区2014招生简章
一个有自己主意的孩子才是有前途的孩子
电子商务培训选东莞金码
女生做什么工作好?
Java工程师就业课程,助你在互联网风口,称霸职场! 5个月让你成为...
高考成绩不理想,该何去何从? fun88网职业技术学校 就业早一步,...
选学校,选专业,就选fun88网
指针
相信大家对下面的代码不陌生:
int i=2;
int *p;
p=&i;
这是最简单的指针应用,也是最基本的用法。再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而是变量的地址。如上代码,指针p中保存的是整型变量i的地址信息。
接下来看如何定义一个指针,既然指针也是一个变量,那么它的定义也和其它变量一样定义:如:int p; 是间接寻址或间接引用运算符。上例中我们还看到了一个特别的运算符&,它是一个取地址运算符(在其他合适场合&也是按位运算运算符,&&为取交集运算符)。
在上面的指针定义中,我们看到了定义的是一个整型指针,难道指针还有类型吗?答案是肯定的,指针只能指向某种特定类型的对象,也就是说,每个指针都必须指向某种特定的数据类型(唯一的例外:指向void类型的指针可以存放指向任何类型的指针,但它不能间接引用其自身。)。比如,int 类型的指针绝对不能指向char 类型的变量。
下面我们给出一个完整的例子来说明指针的简单应用:
#include
voidmain()
{
int a,b,c,*p;
a=1;
b=3;
p=&a;
b=*p+1;
c=*(p+1);
printf("%d %d %d %d /n",a,b,c,*p+3);
}
运行结果为: 1 2 -858993460 4
这是个完整的例子,可以自己在机器上调试一下,现在很多人用的都是微软的Visual Studio 开发环境,有人就不知道在该开发环境中怎么写C程序以及调试C程序,具体境况可以参考附录。
在上面例子中,看到了这样两个表达式b= p+1;和c= (p+1);前者的意思是p所指的地址里的内容加1再赋给b,相当于b=a+1;,后者是p所指的地址加1再把(p+1)所指的地址赋给c,当然我们不知道p的下一个地址里放的是什么,所以输出了一个随机值(这样的操作时很危险的,切记不要使用不确定的内存地址)。
数组
数组大家应该都很熟悉了,用途非常广泛。
int a[4]={2,4,5,9};
此语句定义一个4个空间大小的整型数组a并为它进行了初始化。
数组的基础知识可以参考其他相应的教材,我们在这主要讨论指针和数组的结合应用。
我们再来看个完整的例子:
#include
voidmain()
{
int a[4]={2,4,5,9};
int *p;
p=a;
*p=*p++;
printf("%d %d %d/n",*p,*p+6,*(p+1));
}
运行结果:4 10 5
分析:语句p=a;表示把数组a的第0个元素的地址赋给指针p,数组名a代表的是数组a的第0个元素的地址。
a[i]表示数组a的第i个元素,如果定义一个指针p,那么语句p=&a[0];表示可以将指针p指向数组a的第0个元素,也就是说p的值为数组元素a[0]的地址。那么 (p+1)引用的是数组元素a[1]的内容,p+i是数组元素a[i]的地址, (p+i)引用的是数组元素a[i]的内容。对数组元素a[i]的引用也可以写成 (a+i)。可以得出结论:&a[i]与a+i的含义相同,p[i]与 (p+i)也是等价的。
虽然数组和指针有这么多通用的地方,但我们必须记住,数组名和指针之间有一个不同之处。指针是一个变量,因此语句p=a和p++都是合法的。但数组名不是变量,因此,类似于a=p和a++形式的语句是非法的。
下面来看一个我们常用的函数strlen(char *s):
int strlen(char *s)
{
int n;
for(n=0;*s!='/0';s++)
n++;
return n;
}
因为s是一个指针,所以对其执行自增运算是合法的。执行s++运算不会影响到strlen函数的调用者中的字符串,它仅对该指针在strlen函数中的私有副本进行自增运算。在函数定义中,形式参数char s[]和char *s是等价的。
我们再来看一下地址算术运算:如果p是一个指向数组中某个元素的指针,那么p++将对p进行自增运算并指向下一个元素,而p+=i将对p进行加i的增量运算,使其指向指针p当前所指向元素之后的第i个元素。同其他类型的变量一样,指针也可以进行初始化。通常,对指针有意义的初始化值只能是0或者是表示地址的表达式,对后者来说,表达式所表达的地址必须是在此之前已定义的具有适当类型的数据的地址。任何指针与0进行相等或者不相等的比较运算都有意义。但是指向不同数组的元素的指针之间的算术或比较运算没有意义。指针还可以和整数进行相加或相减运算。如p+n表示指针p当前指向的对象之后第n个对象的地址。无论指针p指向的对象是何种类型,上述结论都成立。在计算p+n时,n将根据p指向的对象的长度按比例缩放,而p指向的对象的长度则取决于p的声明。例如,如果int类型占4个字节的存储空间,那么在int类型的计算中对应的n将按4的倍数来计算。
指针的减法运算也是有意义的,如果p和q指向相同数组中的元素,且p
int strlen(char *s)
{
char *p=s;
while(*p!='/0')
p++;
return p-s;
}
程序中,p被初始化为指向s,即指向该字符串的第一个字符,while循环语句将依次检查字符串中的每个字符,直到遇到标识字符数组结尾的字符’/0’为止。由于p是指向字符的指针,所以每执行以此p++,p就将指向下一个字符的地址,p-s则表示已经检查过的字符数,即字符串长度。
总结:有效的指针运算包括相同类型指针之间的赋值运算;指针和整数之间的加减运算;指向相同数组中元素的两个指针间的减法或比较运算;将指针赋值为0或指针与0之间的比较运算。其他所有形式的指针运算都是非法的。
再来看两条语句:
char a[]=”I am a boy”; char *p=”I am a boy”;
a是一个仅仅足以存放初始化字符串以及空字符’/0’的一维数组。数组中的单个字符可以进行修改,但a始终指向同一个存储位置。而p是一个指针,其初值指向一个字符串常量,之后它可以被修改以指向其他地址,但如果试图修改字符串的内容,结果是没有定义的。 为了更容易理解数组和指针的关系,我们再来看一个函数:
void strcpy(char *s,char *t)
{
int i;
i=0;
while((s[i]=t[i])!='/0')
i++;
}
因为参数是通过值传递的,所以在strcpy函数中可以以任何方式使用参数s和t。
下面是指针实现的几个版本:
void strcpy(char *s,char *t)
{
while((*s=*t)!='/0'){
s++;
t++;
}
}
最简版本:
voidstrcpy(char*s,char*t)
{
while(*s++=*t++)
;
}
这里,s和t的自增运算放到了循环的测试部分中。表达式*t++的值是执行自增运算之前t所指向的字符。后缀运算符++表示在读取该字符之后才改变t的值。同样,在s执行自增运算之前,字符就被存储到了指针s指向的旧位置。上面的版本中表达式同’/0’的比较是多余的,因为只需要判断表达式的值是否为0即可。
指针数组和指向指针的指针
这两个词次听起来挺新颖的,到底是什么意思呢?
由于指针本身也是变量,所以它们也可以像其他变量一样存储在数组中。这一点很容易理解。
#include
#include
voidmain()
{
int i;
char b[]={"wustrive_2008"};
char *a[1];
*a=b;
for(i=0;i
printf("%c",*(a[0]+i));
printf("/n");
}
运行结果:wustrive_2008
这里库函数strlen,strlen为string类的标准库函数,所以要包含#include 。
下面我们来自己写一个strlen函数,我们把上面的例子该成这样:
#include
int strlen(char *s)
{
char *p=s;
while(*p!='/0')
p++;
return p-s;
}
void main()
{
int i;
char b[]={"wustrive_2008"};
char *a[1];
*a=b;
for(i=0;i
printf("%c",*(a[0]+i));
printf("/n");
}
这个运行结果和上个例子一样,不一样的只是我们自己实现了strlen函数,我们再编程时使用的库函数,都是语言的开发者或者系统为我们写好了的函数,其实我们也可以自己写。
这个例子很好的演示了指针数组的用法,指针数组a的值a[1]是一个指针,指向字符数组第一个字符。
指针的指针也很好理解,就是一个指针里放的是另一个指针的地址,而另一个指针可能指向一个变量的地址,还可能指向另一个指针。
指针和多维数组
看两个定义语句:int a[5][10]; int *b[5];
从语法角度讲,a[3][4]和b[3][4]都是对一个int对象的合法引用。但a是一个真正的二维数组,它分配了50个int类型长度的存储空间。但b定义仅仅分配了5个指针,并且没有初始化,它们必须进行显示的初始化,假设b的每个元素都指向一个有10个元素的数组,那么编译器就要为它分配50个int类型长度的存储空间以及5个指针存储空间。指针数组的一个重要优点在于,数组的每一行长度可以不同,也就是说,b的每个元素不必都指向一个有10个元素的向量。
指向函数的指针:
在C语言中,函数虽然不是变量,但可以定义指向函数的指针。这种类型的指针可以被赋值,存放在数组中,传递给函数以及作为函数的返回值等。
如果下面的语句为一个函数的参数,表示什么意思:
int ( p)(void ,void *)
它表明p是一个指向函数的指针,该函数具有两个void 类型的参数,其返回值类型为int。语句if(( p)(v[i],v[left])<0)中,p的使用和其声明是一致的,p是一个指向函数的指针, p代表一个函数。如果写成这样:int p(void ,void )则表明p是一个函数,该函数返回一个int类型的指针。
下面来看两个声明:
int *f(); //f是一个函数,它返回一个指向int类型的指针
int (*pf)(); //pf是一个指向函数的指针,该函数返回一个int类型的对象。
人们为了改变现状,追求自己的幸福生活,越来越多的人都选择了拼搏。那么在拼搏的路上是否真能实现自己的目标,很关键的一步便在于最初的选择,那你需要有一技之长的技术,那么在这个社会,现在学什么技术工资高,就业不用愁呢?那肯定是 学一门好的电脑专业了,高薪资,好就业,前景广阔,提升空间大。要满足这些条件的技术工作,数IT行业最合了!
许多合作企业会根据用人需求和企业发展情况不定期到fun88网东莞金码学校现场招聘IT专业人才,上千家合作企业遍布全国各地,学员根据自己的
项目实训招募啦~~fun88网东莞金码学校合作企业、学术团队举行项目实训招募活动,让学员有机会根据自己的喜好选择项目实训,参与项目的开发。
fun88网东莞金码组织学员进行各种户外拓展、郊游、烧烤等集体活动,让学员们充分感受集体生活的温暖和团队的力量。
2017年1月12日,嘉华教育集团在深圳南山文体中心隆重举办了11周年庆典。出席本次庆典的嘉宾有原外交部副部长胡恩才先生、原深圳大学校长
根据前程无忧的统计数据,截至2013年5月31日,前程无忧的网上发布职位数中面向应届生人群开放的职位数超过11万个,占招聘职位总数的4 25%,
现在越来越多的企业采取小组面试(Panel Interview)。似乎这种面试的形式逐渐成为一种流行的趋势。不仅是初级员工,包括很多高级人才和职业
面试官类型不同,到底都有哪些种类呢?跟着来看看吧。一、呆板稚嫩型这类面试官一般出现在面试的第一轮,他们由于缺乏面试经验,大多数情况
翻遍诸多面试攻略,一般都有这么一条金科玉律:面试一开始不能询问薪水,作为卖方市场的求职者,每次面试时我们都会谨慎言行。明明是正大光
说到面试,大家最关心的,想必是怎样才能从容应对面试官的提问了。虽然,我们在面试经验分享的文章中常能看到求职者要学会包装自己并向面试
有了这些法宝,妈妈以后再也不用担心我加班了~一、产品狗、运营猫的数据处理中心1 infogr am infogr am是一个强大的数据可视化图表创作
本篇文章将记录如何编写一个最简单的WebPart的最后一部分,即添加WebPart,包括把WebPart添加到网站的WebParts列表中,及把WebPart添加到AS
1 splice(start,[,length,newValue ])对数组中某索引范围进行删除 声明数组对象var myArray = ["a", "b", "c", "d", "e"]; 从数
随着移动互联网技术的不断发展,移动互联网用户发送和上传的数据量达到1 3exabytes,相当于10的18方。BigData大数据是继云计算、物联网之后
现在,在各种营销手段都百家争鸣、百花齐放的时代,电子邮件营销几乎一夜之间便显得逊色了许多。然而,令许多企业和厂商纠结不已的是,电子邮件营销虽然已经“人老珠黄”,
初中生无学历无技能,不进工厂上班还可以做什么呢?这是很多低学历人群想要提升自己,却又找到出路的迷茫问题。难道初中生就只有在工厂干体
2015年是嘉华职业教育集团十周年,为了营造浓厚的校园文化艺术氛围,提供给学生一个展示自我、彰显个性的舞台,带动更多学子走进IT职业领域
6月22日下午,青鸟学社全体成员参与了由学习部举办的第二期学习经验交流会,怀着激动的心情,同学们坐等着交流会的开始!随着激动人心的曲子
01岗位了解所谓的工程师是通过学习和训练,掌握网络技术的理论知识和操作技能的网络技术人员。网络工程师能够从事计算机信息系统的设计、建
春节、元宵节是我国民间最重要的传统节日,是我国人民庆贺丰收、祈福风调雨顺、家人团聚的日子。而猜灯谜、吃汤圆则是元宵佳节必不可少的活
在这个大学生很普遍的时代,文凭的重要性也显而易见的不如过去,因为随着社会对人才需求的转型,很多企业都把技能和经验作为聘用人才的标准
在这个大学生遍地皆是的时代,即便拥有大学文凭,也难以找到如意的工作,要在社会上立足,也是一种挑战。对于高中生来说,没有学历优势,如果还没技能的话,要在社会站稳脚跟,那更是难上加难,那么高中毕业究竟可以做什么呢?
因为各种原因不着急找工作,被媒体解读为慢就业这一现象正在高校毕业生中悄然兴起。据企鹅发布的一份毕业季大数据报告,52%的95后毕业大学
正值阳光三月,春光明媚,对于大部分人来说,2018新的旅程才刚刚开始。回想过去的2017,又累又不赚钱的工作,难以满足当今社会的物质需求,总想找一份赚钱多又有前景的职业,提高自己的生活品质,让家人过上更好的生活。
根据一封发给供应商的信件,微软计划重新命名Nokia Oyj为Microsoft Mobile Oy。新的子公司将成为微软公司的移动设备部门。信中的内