赞
踩
目录
2.char *const p和char const *p 以及const char *p三个区别
16.交换两个变量的值,不适用第三个变量。即a=3,b=5,交换之后a=5,b=3;
29.JSO的七层模型是什么? TCP/UDP属于哪一层?TCP/udp有什么优缺点?
31.(void*)ptr和(*(void**))ptr的结果是不是相同?其中ptr为同一个指针
32.已知一个数组table,用一个宏定义,求这个数据的元素个数
答:预编译又可以叫做预处理,是进行一些代码文本的替代工作;
什么时候需要预编译:
char *const p 是一个指针常量,这意味着指针p的值(即它指向的地址)是不可以被改变的,但你可以通过这个指针来修改它所指向的数据。
char const *p 和 const char *p 都是指向常量的指针,这意味着你不能通过这个指针来修改它所指向的数据,但指针p本身(即它指向的地址)是可以改变的。
const char *p: 这与char const *p是等价的,表示指向常量的指针。
- char str1[] = "abc";
- char str2[] = "abc";
- const char str3[] = "abc";
- const char str4[] = "abc";
- const char *str5 = "abc";
- const char *str6 = "abc";
- char *str7 = "abc";
- char *str8 = "abc";
- cout < < ( str1 == str2 ) < < endl;
- cout < < ( str3 == str4 ) < < endl;
- cout < < ( str5 == str6 ) < < endl;
- cout < < ( str7 == str8 ) < < endl;
答:0 0 1 1,因为str1,str2,str3,str4 是数组变量,它们有各自的内存空间;而 str5,str6,str7,str8 是指针,它们指向相同的常量区域。
- void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母
- { for( size_t i=0; i <sizeof(str)/sizeof(str[0]); ++i )
- if( 'a' <=str[i] && str[i] <='z' )
- str[i] -= ('a'-'A' ); }
- char str[] = "aBcDe";
- cout < < "str 字符长度为: " < < sizeof(str)/sizeof(str[0]) < < endl; UpperCase( str );
- cout < < str < < endl;
答案:函数内的 sizeof 有问题。根据语法,sizeof 如用于数组,只能测出静态数组的大小,无法检测动态分配的
或外部数组大小。函数外的 str 是一个静态定义的数组,因此其大小为 6,因为还有'\0',函数内的 str 实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此 sizeof 作用于上只将其当指针看,一个指针为4 个字节,因此返回 4。
答:要看指针是几位,就要看地址总线的位数就好了。80386以后的机子都是32的数据总线,所以指针的位数是4个字节!
- #include<stdio.h>
- int main()
- {
- int a[5]={1,2,3,4,5};
- int *ptr=(int *)(&a+1);
- printf("%d %d ",*(a+1),*(ptr-1));
-
- return 0;
- }
答案:2 5
因为我们的*(a+1) 就是a[1],*(ptr-1)就是a[4],所以结果就是2,5. 因为我们&a+1不是首地址+1,系统会认为加一个a数组的偏移,就是偏移另一个数组的大小 int*ptr=(int *)(&a+1);则ptr实际上就是&(a[5]),也就是a+5 原因:因为&a是数组指针,类型是int(*)[5];而指针加上1要根据指针类型加上一定的值,不同的类型指针+1之后增加的大小不同a是长度为5的int数组指针,所以要加上我们的5*sizeof(int),所以ptr实际就是a[5],但是ptr和(&a+1)类型是不一样的(这一点很重要),所以ptr-1只会减去size(int*)。
- #include<stdio.h>
- int main()
- {
- char a;
- char *str=&a;
- strcpy(str,"hello");
- printf(str);
- return 0;
- }
答:没有给str分配内存空间,将会产生异常,问题出在讲一个字符串复制进到一个字符变量指针所指向的指针。虽然可以正确输出结果,但是越界进行内存读写会导致程序崩溃!
- #include<stdio.h>
- int main()
- {
- char *s="AAA";
- printf("%s",s);
- s[0]='B'
- printf("%s",s);
- return 0;
- }
答:“AAA”是我们的字符串常量,s是指针,指向这个字符串常量,所以声明s的时候就有问题。const char *s ="AAA";然后又因为是常量,所以对是s[0]的赋值操作是不合法的;
答:#define MIN(X,Y)((X)>(Y)?(Y):(X)) //注意,结尾这里没有“;”
答:使用while(1){}或者for(;;)
答:定义静态变量 或者 定义静态函数
答:定义常量不可以修改的变量
答:含义:用于提示编码器对象可能在编码器没有监测到情况下改变;
- 并行设备的应缴寄存器(状态寄存器);
- 中断函数中会访问到的非自动变量;
- 多线程应用当中呗几个任务共享的变量;
答:int类型指针数组求整,是一个函数指针数组,每一个指针指向一个int func(int param)的函数;
- int a=248,b=4;
- int const c=21;
- const int*d=&a;
- int *const e=&b;
- int const *f const=&a;
- //请问下列表达式哪一些会被编码器禁止?为什么?
答:*c=32; d=&b; *d=43; e=34; e=&a; f=0x321f; *c 这是个什么东东,禁止 *d 说了是 const, 禁止 e
= &a 说了是 const 禁止 const *f const =&a; 禁止
答:有两个解法,一个是使用算数运算,另一个就是使用异或,算术运算:a=a+b;b=a-b;a=a-b; 异或:a=a^b;
答:主要区别是C当中的struct不可以函数成员函数,但是C++中对的可以。C++中的struct和class的主要区别在于默认的存取权限不一样,struct默认为public,但是class默认为private。
- #include <stdio.h>
- #include <stdlib.h>
- void getmemory(char *p)
- {
- p=(char *) malloc(100);
- strcpy(p,"hello world");
- }
- int main()
- {
- char *str=NULL;
- getmemory(str);
- printf("%s/n",str);
- free(str);
- return 0;
- }
答:程序会爆炸,因为getmemory中的malloc不可以返回动态内存,free()对str操作很危险。
- char szstr[10];
- strcpy(szstr,"0123456789");
答:产生的结果是:长度不一样,会造成我们非法的OS
答:原子操作 信号量机制 自旋锁 管程 ,会合 ,分布式系统
答:共享存储系统信息传递系统管道;一文件系统为基础
答:资源竞争以及进程推进顺序非法
互斥、请求保持、不可剥夺、环路
鸵鸟策略、预防策略、避免策略、检测与解除死锁
FCTS、优先级、时间片轮转、多级反馈
类的静态成员每个类只有一个,非静态成员每个对象一个
virtual void f()=0;注意接口,之类必须要实现
答:数组存数据按照顺序存储,固定大小;
链表存数据随机,大小可以动态改变
答:应用层、表示层、会话层、传输层、网络层、链路层、物理层;
tcp属于传输层;TCP 服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。与 TCP 不同, UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等。由于 UDP 比较简单,UDP 头包含很少的字节,比 TCP
负载消耗少。 tcp: 提供稳定的传输服务,有流量控制,缺点是包头大,冗余性不好 udp: 不提供稳定的服务, 包头小,开销小
- int main()
- {
- int x=3;
- printf("%d",x);
- return 1;
- }
问题:函数既然不会被其他函数调用,为什么会返回1?
答:因为在main当中,C语言的标准是认为0代表成功,非0代表错误,具体的值是某中具体出错信息。
答:两个结果是相同的;
答:#define NTBL(table) (sizeof(table)/sizeof(table)[0])
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。