关于指针的15个经典面试题

1. 常指针与常量的指针
        char * const p;
  char const * p
  const char *p
  上述三个有什么区别?

  char * const p;   //p为只读指针。
  char const * p;//p值只读的指针。
  const char *p; //和char const *p

---------------------------------------------------
2.定义与声明
声明是普通的声明:它所描述的并非自身,而是描述在其他地方创建的对象。
定义是特殊的声明:它为对象分配内存,即现场创建对象。

---------------------------------------------------
3.左值与右值
 I.左值:编译时可知。左值可以分为可修改左值和不可修改左值,数组名就是一个不可修改的左值。即不能给数组名赋值!(注意这里指的是“数组名”) 这是为什么呢?下面有一个现场:
char a[10] = {'a'};
char b[10] = {'b'};
a = b;
编译时出现的错误:
error: incompatible types when assigning to type ‘char[10]’ from type ‘char *’
结论:
当数组名为左值时,它的类型是字符数组;当数组名为右值时,它的数据类型是字符指针。

 II.右值:运行时可知。
---------------------------------------------------

4.指针与数组
 如果编译器需要一个地址来执行一种操作,对于被定义的数组变量而言的,它地址在编译时可知,所以它就可以直接进行操作;而对于被声明的指针而言,只有在程序运行的时候才知道它所指向的地址的值,然后才能在当前地址上操作。

 char array[] = “sdfsdf”;   …   c = a[i];
 数组的下标引用步骤:(1)取编译器符号中的符号array的地址(假设是8888)
         (2)array[i]即为取地址8888+i的内容。
 char *p; … c = *p;
 指针的间接引用步骤:(1)取编译器符号表中符号p的地址(假设是7777)
         (2)获取7777位置处的内容(假设是9999)
         (3)取9999处地址的内容,即为*p
 
 char *p = “abcdefg”;
 char a[] &

  • 3
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值