C C++指针面试题零碎整理

int a;
int* p = &a;

答:p指向a的地址,&是取a的地址。*指的是指针中取内容的符号。

2.str[]和str*的区别:

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; 0 1 cout<<(str3="=str4)<<endl;" cout<<(str5="=str6)<<endl;" cout<<(str7="=str8)<<endl;" 输出 < code></(str1==str2)<<endl;>

这题不是比较字符串内容,而是比较字符串的地址。str1,str2,str3,str4都是新数组,分配新空间。所以它们的地址不同。后面四行是浅拷贝。就是把新指针指过去。

答:结果是:0 0 1 1str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域

3.str[]用sizeof会出错吗?

int MyStylen(char str[])
{
    return (int)(sizeof(str)-1);//&#x65E0;&#x8BBA;&#x4F55;&#x65F6;&#x90FD;&#x662F;&#x8FD4;&#x56DE;3
}

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

但是按照下面的代码就会得到正常的值:

char str[] = "hello world";
int len = sizeof(str)-1;
cout<<len; 11 输出 < code></len;>

4.注意数组指针和指针

int a[5] ={1,2,3,4,5};
int *ptr = (int *)(&a+1);
cout<<*(a+1)<<" 5 "<<*(ptr-1); 输出2 < code></*(a+1)<<">

&a代表的不是取a这个变量的地址,而是 取数组元素的地址a指向 数组的头部,就是第一个元素的地址。数组名a和&a的内存地址相同。

因此,&a+1,表示跨过了整个数组。指向的是第六位。

所以ptr-1就是a[5]的第五位。

sizeof(a) = 20 //5 _4,长度_类型字节数。

sizeof(&a) = 20 //5 _4,长度_类型字节数。

int main()
{
    int a[5];
    printf("%d\n", a);// 1245036, &#x6307;&#x5411;&#x7B2C;&#x4E00;&#x4E2A;&#x5143;&#x7D20;&#x7684;&#x9996;&#x5730;&#x5740;
    printf("%d\n", &a);//1245036, &#x6307;&#x5411;&#x6574;&#x4E2A;&#x6570;&#x7EC4;&#x7684;&#x5730;&#x5740;
    printf("%d\n",a+1);//1245040, a[1]&#x5143;&#x7D20;&#x7684;&#x5730;&#x5740;
    printf("%d\n",&a+1);//1245056, &#x6574;&#x4E2A;&#x6570;&#x7EC4;&#x7684;&#x5B57;&#x8282;&#x957F;&#x5EA6;
    printf("%d\n",&a[0]+1);//1245040, &#x4E0B;&#x4E00;&#x4E2A;&#x5143;&#x7D20;&#x7684;&#x5730;&#x5740;
    printf("%d\n",sizeof(a));//&#x6570;&#x7EC4;&#x4E0D;&#x81EA;&#x52A8;&#x8F6C;&#x6362;&#x4E3A;&#x6307;&#x9488;&#xFF0C;&#x5F97;&#x5230;&#x7684;&#x7ED3;&#x679C;&#x662F;&#x6570;&#x7EC4;&#x7684;&#x957F;&#x5EA6;*&#x6570;&#x7EC4;&#x4E2D;&#x5143;&#x7D20;&#x7C7B;&#x578B;&#x6240;&#x5360;&#x7684;&#x5B57;&#x8282;&#x6570;
    printf("%d\n",sizeof(&a));//&#x540C;&#x4E0A;
    printf("%d\n",(int)a+1);//1245037 (1245036+1)
    return 0;
}

5.注意指针要分配给足够的空间

char a;
char *str = &a;
strcpy(str, "hello");
cout<<str; < code></str;>

请问上面的程序是否可以正常运行?

答: 不能。因为 char类型的a变量只拥有了一字节的空间,但是”hello”拥有6字节的空间(包含最后的’\0’),所以程序崩溃。

6.小心编译器的指针字符串初始化

char *s="AAA";
cout<<s<<endl; s[0]="B" ; cout<<s<<endl; < code></s<<endl;>

这段程序能否正常运行?

答: 不能。因为char s默认为只读值,将char a改为char a[]即可。如果定义const char *a也是没有必要的,因为本身已经是只读了,不需要加const设为常数值。

7.函数指针

int(*s[10])(int);

不懂。

8.函数传递指针的时候是副本

void GetMemory(char *p)
{
    p=new char[100];
    strcpy(p,"hello world");
}
void main(void)
{
    char *str=NULL;
    GetMemory(str);
    cout<<str; delete []str; str="NULL;" } < code></str;>

上述代码能运行吗?

解答: 不能。因为函数参数不能传递分配空间的,不能返回的。可以这样修改:

void GetMemory(char **p)   // &#x6539;&#x6210;&#x6666;&#x6DA9;&#x96BE;&#x61C2;&#x7684;&#x6307;&#x9488;&#x7684;&#x6307;&#x9488;
{
    *p=new char[100];     //&#x7ED9;*p&#x7684;&#x5206;&#x914D;&#x5730;&#x5740;
    strcpy(*p,"hello world");   // &#x62F7;&#x8D1D;&#x5185;&#x5BB9;&#x5230;*p
}

void main(void)
{
    char *str=NULL;
    GetMemory(&str);    //&#x8FD9;&#x5730;&#x65B9;&#x53D6;&#x5730;&#x5740;
    cout<<str; delete []str; str="NULL;" } < code></str;>

9.要时刻记住初始化字符串:

char a[10];
cout<<strlen(a)<<endl; < code></strlen(a)<<endl;>

sizeof()和初不初始化没有关系,但是库函数strlen()和初始化有关。所以strlen(a)不会返回10。

Original: https://www.cnblogs.com/mysweetAngleBaby/p/16725482.html
Author: 一眼万年的星空
Title: C C++指针面试题零碎整理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/619955/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球