c++面试 笔试基础知识学习记录

发布时间 2023-05-31 15:25:22作者: 阳光中的影子

1. int (*p)[4] 和 int* p[4]

int (*p)[4] ,p是一个指针变量,指向一个存放4个int变量的一维数组,p+1是向后移动数组长度个字节大小,也就是向后移动4个int字节的大小。

*(*(p+1)+2)=*(p[1]+2)

int *p[4] ,等价于int *(p[4]),[]优先级高于*所以p首先是一个数组。即定义了一个指针数组,p就是指针数组名,数组中存放了4个指向int变量的指针。和普通数组类似,只不过数组里存的是指针。

2.字符型指针数组

char* data[]={"1234","456","123145"}

上述语句中的元素“1234” “456”等都是char*类型的

所以data数组中存储了三个元素,元素类型为char*, data[0]就是“1234”,data[1]就是“456”.....

*data就是data[0],*(data+1)就是data[1]

为什么char*类型可以是“1234”这样的一个字符串变量呢,因为字符串变量的本质表现是其第一个字符的地址,char*变量中存储的就是该字符串首地址,结尾标志是\0。

 

函数调用时的入栈方式:首先是函数调用的下一条指令的地址入栈,然后函数参数入栈(顺序一般是从右向左依次入栈),接下来是局部变量入栈,调用函数运行完后,依次出栈,栈顶指针指向之前存的下一条指令的地址,程序从该位置继续运行。

关于char* p="abc" 和char p[]="abc"的区别,前者不能改变和重新赋值,后者可以改变其中的字符。具体如下:

指针常量和常量指针

指向常量的指针,就是常量指针,常量是不可以修改的。char buf[]="abcd",const char *p=buf,const修饰char。但是p可以重新指向其他的常量,方法:char buf2[]="1234",p=buf2;(这里隐式的把buf2转成了 const char*)

指针常量,指针本身是常量,不能改变其指向 。char buf[]="abcd",char* const p=buf,const修饰的指针p,指针p的内存是不可以修改的,所以使用这种方式必须初始化。p不可以指向其他的变量,但是p指向的变量的内容可以修改,例如:p[0]='m',此时p指向的变量内容为mbcd。

 

个人学习记录,如有错误请指出,感谢!