近来几天白天有时候比较有空,所以就复习看看资料,这两天,有了重新温习一下C语言的干劲,于是就记录下来一些点滴。
在计算机中,所有的数据都是存放在存储器中的.一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数是不等的,如整型量占2个单元,字符量占1个单元.为了正确地访问这些内存单元,必须为每个内存单元编上号即可准确地找到该内存单元,内存单元的编号也叫做地址。根据内存单元的编号中地址就可以找到所需的内存单元,所以也把这一个地址称为指针。
严格地说,一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的指针的值,是变量。
变量的指针就是变量的地址。存放变量地址的变量是指针变量。
1、定义一个指针变量
int *p1;
float *p2;
注意一点,一个指针变量只能指向同类型的变量。
2、指针变量的引用
指针变是的赋值只能赋予地址,决不能赋予任何其他的数据,否则将引起错误。如:
int a ;
int *p = &a;
或
int a;
int *p;
p = &a;
3、指针变量作为函数参数,举例:
swap(int *p1,int *p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
exchange(int *q1,int *q2,int *q3)
{
if(*q1<*q2) swap(q1,q2);
if(*q1<*q3) swap(q1,q3);
if(*q2<*q3) swap(q2,q3);
}
注意一点,在指针变量说明中,"*"是类型说明符,表示其后的变量是指针类型。而表达式出现的"*"则是一个运算符用以表示指针变量
所指的变量。
如:
int a,*pa = &a,*pb;
pb = pa; /*把a的地址赋予指针变量pb*/
4、指针变量的一些细节内容
4.1、可以把数组的首地址赋予向数组的指针变量.如
int a[5],*pa;
pa = a; /*这一句也可以写成 pa = &a[0]; */
4.2、也可以把字符串首地址赋予指向字符类型的指针变量。
例如:
char *pc;
pc = "C Language";
当然也可以直接赋值啦:char *pc = "lighter.iteye.com";
4.3、把函数的入口赋予指向函数的指针变量,如:
int (*pf)();
pf = function; /*function为函数名称*/
4.4 对于指向数组的指针变量,可以加上或减去一个整数n。设p是指向数组a的指针变量,则p+n,p-n,p++,++p,p--,--p的运算都是合法的。
如:
int a[5],*pa;
pa = a;
pa = pa +2; /* pa 指向a[2],即pa的值为&pa[2] */
5、数组指针
看一个例子:
int a[10];
int *p = a;
注意一下,p+i和a+i就是a[i]的地址,或者说它们指向a数组的第i个元素。
*(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即a[i]。
另外一点,指针变量可以实现本身的值的改变,如p++是合法的,而a++是错误的。因为a是数组名,它是数组的首地址,是常量。
*p++,由于++和*同优先级,结合方面自右而左,等价于*(p++)
6、数组名作函数参数,可以用指针的方式来实现
float aver(float *pa);
main(){
float sco[5],av,*sp;
int i;
sp = sco;
for(i =0;i<5;i++) scanf("%f",&sco[i]);
av = aver(sp);
printf("%5.2f",av);
}
float aver(float *pa){
int i;
float av,s=0;
for(i=0;i<5;i++) s = s+*pa++;
av = s/5;
return av;
}
再看一个例子,查看最大值与最小值的
int max,min;
void max_min_value(int array[],int n){
int *p,*array_end;
array_end = array + n;
max = min = *array;
for(p=array +1;p<array_end;p++)
if(*p>max) max = *p;
else if(*p < min) min = *p;
return;
}
总结一个,如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参的对应关系有以下几种:
I、形参和实参都是数组名
II、实参为数组,形参为指针变量
III、实参,形参都用指针变量
IV、实参为指针变量,形参为数组名
7、字符串指针变量
举例,想要输入字符中N个字符后所有字符。
main(){
char * ps = "lighter.iteye.com";
int n = 10;
ps = ps + n;
printf("%s\n%",ps);
}
再写一个例子,要求把一个字符串的内容复制到另一个字符串
cpystr(char *pss,char *pds){
while(*pds++=*pss++);
}
注意一点,字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在该首地址为首的一块连续的内存空间并以
'\0'作为串的结束。字符数组是由于若干数组元素组成的,它可用来存放整个字符串。
8、指针数组
举例,定义一个指针数组:int *pa[3];
9、指向指针的指针
main(){
char *name[] = {"lighter","javaeye","com","nice"};
char **p;
int i;
for(i=0;i<4;i++){
p = name + i;
printf("%s",*p);
}
}
分享到:
相关推荐
斐讯_N1_盒子玩法很多,心血来潮,收集一下斐讯_N1_盒子_ROM_固件及遥控器。_N1-Rom
本篇将深入探讨一个基于C语言的学生管理系统,该系统在Linux环境下运行,并且经过了100%的调试验证,是作者精心整理的心血之作。 一、C语言基础 C语言是计算机科学的基础,其语法简洁明了,执行效率高。在编写学生...
3. **指针**:C语言的指针是其独特魅力之一,通过指针可以间接访问和修改内存中的数据。学习如何声明、初始化和使用指针,以及指针与数组、函数的关系,对于深入理解C语言至关重要。 4. **内存管理**:C语言提供了...
北师大的C语言课件,作为教师的心血结晶,旨在帮助学生系统地掌握C语言,理解其工作原理,并提升编程技能。通过深入学习这些课件,学生不仅可以为未来的计算机科学课程打下坚实基础,还能为进入IT行业做好准备。无论...
“本书是Summit以及C FAQ在线列表的许多参与者多年心血的结晶,是C语言界最为珍贵的财富之一。我向所有C语言程序员推荐本书。” ——Francis Glassborow,著名C/C++专家,ACCU(C/C++用户协会)前主席 “本书清晰...
恰逢RTT,NXP与LVGL联动白嫖活动,心血来潮,也想做一个自己的电子宠物,所以就有了本项目。 【功能实现】 显示bilibili小电视图案 表情根据指令做出相应变化 睡觉 休息 专注 向左看 向右看 其他编码后的表情 环境...
3. **内存管理**:C语言需要程序员手动进行内存分配和释放,游戏源代码中会看到malloc和free函数的使用,理解如何合理分配和回收内存以避免内存泄漏至关重要。 4. **输入/输出(I/O)处理**:游戏需要接收用户输入...
本书涵盖了C语言的基础知识,如变量、数据类型、控制结构、函数、指针、数据结构等,也包括了对文件操作和错误处理的讲解。而其教学方式适合于德语区的学习者,因此在德语国家和地区被广泛用作编程入门教材。 教材...
1. C语言源代码:C语言是一种基础且强大的编程语言,广泛应用于系统编程、嵌入式系统、驱动开发等领域。在源码网站上,你可以找到C语言的基本语法示例、算法实现、操作系统内核片段等,这对于初学者理解和提高编程...
2. **指针与内存管理**:C语言中的指针是其独特且强大的特性之一。指针允许程序员直接操作内存,实现高效的数据处理和复杂的数据结构。理解指针的概念、声明、初始化和解引用是掌握C语言的关键。 3. **结构体与...
类C语言编译器,基本上实现了主要功能的C语言语法,词法分析使用状态转移,语法使用LR(1)方法,自动生成ACTION和GOTO转移表。自顶向下的语法制导翻译,可以生成各种类型的表达式(包括布尔,算术,逻辑等等),...
是上课的课件 谭浩强件c语言谭浩强第三版,心血
类C语言编译器是一种基于C语言语法设计的编译工具,它主要目的是解析源代码并将其转换为目标机器代码,以便计算机能够理解并执行。在本项目中,编译器基本实现了C语言的主要功能,包括变量声明、函数定义、控制流...
PDI系列模块是美盛科技又一个新的心血结晶。 PDI系列模块拥有超高直流/直流转换效率,对于在电能的接取、热能的减少与可靠度的提升方面,皆可带来出色的表现。PDI系列模块在热累积情况上的突破,不仅能对系统...
自己边学边完成的题目,可能对你有帮助。其中题目都是通过编译的,最近心血来潮,本着分享的精神,就上传至此平台,希望对大家的学习有帮助
程序会显示运行次数和关数 ...独创断点再接功能,程序退出会记忆游戏进程,重新运行可以继续游戏。 移动盘子状态界面呈绿色 已通过的关卡显示开放状态 本程序已经过多人测试和多次修改 心血之作,堪称精品。