设为首页 加入收藏

TOP

C语言中基础小问题总结(二)
2014-11-23 21:53:56 来源: 作者: 【 】 浏览:2
Tags:言中 基础 问题 总结
};
int (*p)[2];
p=a;//p指向二维数组的首行地址
printf("%d\n",**p);//*p是元素的地址,**p则为元素内容
printf("%d\n",*(*(p+1)+1));
}
15、指针数组
int *p[4];表示一个数组中含有4个int型指针。
char *p[4];表示一个数组中含有4个char型数组,或则4个字符串
16、二维数组中的各个地址
int a[2][3];
则a为首行地址,*a为首行第一个元素地址,**a为首行第一个元素的值
a+1为第二行地址,*(a+1)为第二行第一个元素的地址,**(a+1)为第二行第一个元素的值
*(a+1)与a[1]等价:都代表第二行第一个元素的地址
例子:
main()
{
int a[2][2]={1,2,3,4};
printf("a=%d\n",a);
printf("*a=%d\n",*a);
printf("**a=%d\n",**a);
printf("*a+1=%d\n",*a+1);
printf("a+1=%d\n",a+1);
printf("a[1]=%d\n",a[1]);
printf("a[1]+1=%d\n",a[1]+1);
printf("*a[1]=%d\n",*a[1]);
}
17、字符指针变量在接受输入字符串时,必须先开辟存储空间
char *cp;
scanf("%s",cp);
以上是错误的。
可以改为:
char cp[20];
scanf("%s",cp);
或者
char *cp,str[20];
cp=str;
scanf("%s",cp);
总之,一定要先开辟空间,再接受字符串
18、c和c++中的返回值不能是数组,java返回值可以是数组
19、指针函数和函数指针
指针函数:int * function();
函数指针:
int (*p) ();
int max(int a,int b);
p=max;
int a=(*p)(2,3);
20、关于变量的生命周期
函数中定义的局部变量是不能作为返回值的,因为函数结束后,局部变量就被回收了。
21、结构体
结构体中可以嵌套结构体,但不能是其本身。且成员结构体的定义必须在主结构体之前。
22、malloc
malloc函数位于stdlib.h中,函数原型为void * malloc(unsigned size);
eg: struct student *p=(struct student *)malloc(sizeof(struct student));
因为malloc返回的是一个void类型的指针,所以要强制转换。
23、free
该函数原型为
void free(void * ptr)
释放有指针ptr指向的动态分配的内存空间。为保证动态存储区的有效利用,当某个存储空间不再使用时,就应该及时释放它。
24、结构体和共用体
(1)结构体
结构体可以作为函数的参数和返回值。
结构体只有在初始化的时候才能直接用大括号{}形式赋值;当先声明,后赋值时候,就只能单个元素赋值,不能再用大括号形式了。这个跟数组的赋值类似。举例如下
struct student
{
int bh;
char *name;
};
struct student stu={1,'typ'};//是正确的
但是下面的是错误的
struct student stu;
stu={1,"typ"};//是错误的
此时这能stu.bh=1;stu.name="typ"
(2)共用体
共用体不能作为函数的参数和返回值
共用体不能同时存放,每一时刻只能存放一个成员,以最后一次存放的成员为有效成员。共用体的大小是最大元素所占用的大小;
共用体可以出现在结构体类型中,反之,结构体也可以出现在共用体的类型中
25、枚举类型
enum color {red,green,blue};
enum color c=red;
int i=red;//值为0
26、类型标识符的重定义
c语言中用关键字typedef来声明新的类型名
typedef int INTEGER;
INTEGER x,y;
等价于
int x , y;
又比如结构体定义:
typedef struct
{
int num;
char name[10];
float score;
}student;
student stu1, stu2, *s;
另外,typedef只是进行类型重定义,只是为该类型命名一个别名,并不产生新的数据类型
27、位运算
包括(与、或、异或、取反)。
其中,位运算符进行运算时,数都是以补码形式参加运算,且符号位参与运算。
异或:相同为0,不同为1
a^a=0;a^0=a;a^~a=1;
此处可以用异或来实现两数的交换
a=a^b;
b=b^a;
a=a^b;
这样避免引入临时变量
28、移位运算
(1)a<
(2)a>>b,表示a的二进制值右移b位
移位运算具体实现有3种形式:
(1)循环移位:移入的位等于移出的位
(2)逻辑移位:移出的位丢失,移入的位取0
(3)算术移位:移出的位丢失,左移入的位取0,右移入的位取符号位,符号位保持不变
C语言的移位运算与具体的C编译 系统有关,如VC++6.0采用的是算术移位
注意:移位操作并不会改变原操作数的值。例如a>>2运算后,a的值保持不变,除非通过赋值a=a>>2来改变a的值。
29、文件
(1)C语言中文件是字节流文件.
(2)C中为用户定义的文件类型是FILE,FILE文件类型是结构体类型,FILE结构是用关键字typedef定义出的一种结构。
struct _iobuf
{
char * _ptr;
int _cnt;
char *base;
int _flag;
int _file;
.........
};
typedef struct _iobuf FILE;
(3)文件打开与关闭
文件指针 = fopen("文件路径\\文件名", "文件操作方式");
操作方式分为r,w,a,r+,w+,a+
如果fopen打开失败,则返回NULL
如果缓冲区未满512B,那么不会写到磁盘中,万一程序异常终止,则缓冲区中数据丢失,导致文件不完整。只有对打开文件执行关闭操作时,才能强制把缓冲区中不足512B的数据写到磁盘文件中,保证文件的完整性。fclose函数用来关闭文件
fclose(文件指针);
返回值是一个整数值,若为0,表示正常关闭,否则表示无法正常关闭文件。
(4)文件的输入和输出
读写一个字符:char fge
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言位运算符:与、或、异或、取.. 下一篇objective-C 自定义对象归档的实现

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: