很早以前面试了一家公司,本来我是做iOS的,结果这家公司只有做C++和android的,硬着头皮去面试C++,昨天准备了一个早上。结果人事给了我一份C语言的面试题。虽然都是一些基础的题目但是我一道题也答不上来。凭着模糊的记忆,还能记下几道题。
1、const的做用至少说出两个
归纳了一下大致分为以下几点
1.限定变量为不可修改。
2.限定成员函数不可以修改任何数据成员。
3.const与指针:
const char *p 表示 指向的内容不能改变。
char * const p,就是将P声明为常指针,它的地址不能改变,是固定的,但是它的内容可以改变。
// 修饰变量a不可变
const int a = 7;
// 修饰指针p不可变 *p可以改变
int a = 8;
int* const p = &a;
*p = 9
// 修饰函数参数 a 不可变
void func(const int a)
{
cout<<a;
}
// 当 const 参数为指针时,可以防止指针被意外篡改。指针a不能被修改
void func(int *const a)
{
cout<<*a<<" ";
*a = 9;
}
// A:const 修饰内置类型的返回值,修饰与不修饰返回值作用一样。
// B: const 修饰自定义类型的作为返回值,此时返回的值不能作为左值使用,既不能被赋值,也不能被修改。
// C: const 修饰返回的指针或者引用,是否返回一个指向 const 的指针,取决于我们想让用户干什么。
const int func()
{
return 1;
}
// const 修饰类成员函数,其目的是防止成员函数修改被调用对象的值,如果我们不想修改一个调用对象的值,所有的成员函数都应当声明为 const 成员函数。
int func()const
{
return _cm;
}
2、sizeof和strlen的区别
sizeof是操作符,参数为任意类型,主要计算类型占用内存大小。
strlen()是函数,其参数为char*,strlen只能计算以"\0"结尾字符串的长度,计算结果不包括"\0"。
char str[]="abced";
// 字符数组str包含6个元素(a,b,c,d,e,\0),每个元素占用1个字节。
int a= sizeof(str);
// len为5,不包含"\0"。
int len=strlen(str);
//str[0]是字符元素a,所以b=1
int b= sizeof(str[0]);
32位系统中内置数据类型占用的字节数
char :1个字节(固定)
*(即指针变量): 4个字节(32位机的寻址空间是4个字节。同理64位编译器)(变化*)
short int : 2个字节(固定)
int: 4个字节(固定)
unsigned int : 4个字节(固定)
float: 4个字节(固定)
double: 8个字节(固定)
long: 4个字节
unsigned long: 4个字节(变化*,其实就是寻址控件的地址长度数值)
long long: 8个字节(固定)
64位系统中
*(即指针变量): 8个字节
long: 8个字节
unsigned long: 8个字节(变化*其实就是寻址控件的地址长度数值)
其余都一样
3、指针函数对a、b两个值进行交换
int swap_pointer(int *p1, int *p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
return 0;
}
int main()
{
int a = 3, b = 5;
swap_pointer(&a, &b);
printf("a = %d ,b = %d\n",a, b); //交换成功
return 0;
}
4、双向链表删除一个节点
typedef struct Node
{
int element;
struct Node *prior;
struct Node *next;
}node;
// 生成100的双向链表
Node *create() {
node *head, *p;
head = (node *)malloc(sizeof(node));
head->element = 99; // 结束标识
p = head;
for (int i = 0; i < 100; i++) {
p->next = (node *)malloc(sizeof(node));
p->next->prior = p;
p = p->next;
p->element = i;
}
p->next = head;
head->prior = p;
return head;
}
// 删除指定的元素
int delete(Node *head, int a) {
node *p;
p = head->next;
while(p->element != a) {
p = p->next;
}
if (p->element == a) {
p->prior->next = p->next;
p->next->prior = p->prior;
return 1;
} else {
return 0;
}
}
// 删除50的元素
int main() {
node *head = create();
delete(head, 50);
}
网友评论