面试题-指针-指针与数组

本文详细探讨了指针与数组在C++中的区别,包括它们的内存分配、类型和操作。从数组和指针的基础概念出发,通过一系列面试题解析了数组和指针在内存、地址、赋值、字符串等方面的不同行为,帮助读者深入理解这两种重要的数据结构。文章最后还强调了指针作为左值和右值时的不同,以及在实际编程中需要注意的常见陷阱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

返回目录:https://blog.youkuaiyun.com/chen1083376511/article/details/82723709

+问题:

问:数组与指针的区别?

答:数组是多个元素的集合,在内存中分布在地址相连的单元中,所以通过其下标访问不同单元的元素。指针是一种变量,只不过它的内存单元中保存的是一个标识其他位置的地址。由于地址也是整数,在32位平台下,指针默认为32位。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
+问题:
问:说说char a1[]=“hello”和char *a2="hello"的区别?
答:

a1是一个数组,定义时开辟了数据内存,把常量“hello”赋值给a1(即拷贝),所以常量占有一块内存,而a1又开辟了一块相等的内存。
a2是一个字符类型的指针,指向一个常量"hello"的地址,仅仅只有常量占有内存,而指针本身占有内存为4个字节。(在32位机器中)

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

问题:

问:下面的输出结果是?

void *fun(char *arr)
{
    char *arr2 ="world";
    arr = arr2;
    return arr;
}
int main()
{
    char *ch = "hello";
    fun(ch);
    cout << ch << endl;
    return 0;
}

:hello

分析:

这道题主要考指针作为形参的知识点,考时容易出错。由于arr是形参,属于局部变量,作用只在fun函数里面,调用函数完了之后,arr就被释放掉了。实参ch指向仍然不会改变指向。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

问题:

问:下面哪个语句不合法?

char a[10] = {'a'};
 char b[10] = { 'b' };
 a= b;

答:a=b;语句不合法。因为这里数组名a和b是字符指针类型的(char*),a作为左值时,是不可修改的值。

分析:
当数组名为左值时,它的类型是字符数组;当数组名为右值时,它的数据类型是字符指针。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

问题:

问:下面代码的输出结果是什么?
int pstr(char str[])
{
 return (int)(sizeof(str)-1);
}
void main()

 char a[20] = "Hello world";
 printf("%d",pstr(a));
}

答:3

分析:

当用函数传递的数组指针的时候就自动退化为指针了,而指针的长度是4,你减去1自然就是3了.

修改如下:

void main()

 char a[] = "Hello world";
 int len = sizeof(a)-1;
 printf("%d",len);
}

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

+问题:

问:下面代码输出结果是什么?

void main(void)
{
 char *b = "hello";
 cout << sizeof(b) << endl;
 cout << sizeof(*b) << endl;

}
答:

4 1

分析:sizeof(b) 中b是char*类型的,输出的结果是指针类型的长度。而sizeof(*b) 中的*b是char类型的,长度为1.

cout<<sizeof(char)<<endl;结果是1

cout<<sizeof(int)<<endl;结果是4

cout<<sizeof(unsigned int)<<endl;结果是4

cout<<sizeof(long int)<<endl;结果是4

cout<<sizeof(short int)<<endl;结果是2

cout<<sizeof(float)<<endl;结果是4

cout<<sizeof(double)<<endl;结果是8

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

问题:

问:下面语句的输出结果是什么?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值