关于C语言范式里面字符串指针的理解
在斯坦福大学公开课里面有个《编程范式》的教程,其中有个视频上讲述了swap函数,写法如下:
void swap(void *vp1,void *vp2,int size) { char *buffer[size]; memcpy(buffer,vp1,size); memcpy(vp1,vp2,size); memcpy(vp2,buffer,size); }
然后声明两个整形变量和字符串变量来调用该函数,指出不同点,注意点,如下;
int a=44; int b=5; swap(&a,&b,sizeof int) //经转换之后结果a=5;b=44; //下面这一个字符串交换是难点 char *husband="Wiilom"; char *wife="Fred"; //这里面英文名字随意写了,主要是理解意思 swap(&husband,&wife,sizeof(char *));//这一句是重点,传入的是指针地址
关键是为什么传入的是&husband这样的指针的指针,而不是husband这个指针呢?
作者是这样解释的,因为我们如果要交换 int型的变量,传入的是int型变量的指针和大小,即&a,和sizeof int (注意这里面sizeof(int)的括号可以不用写),然后如果要传入char× 型的变量,自然要传入cha ×型的指针和大小了,
即&husband和sizeof (char ×)。作者然后举例如果传入不加&修饰符的情况。其实这里面感觉很不明显,那怎样去理解呢,我是这样理解的,当要交换的数据的时候,我自然要传入数据的指针,但是字符串长度不一样,所以我要传入
指向该字符的地址,即交换该指向字符串的地址,比如husband指向willom,wife指向fred,那么我只要交换这两个指针的值,就可以让husband指向fred,而wife指向willom,那么问题就转换成我要交换husband这个地址的值,假设这个值
是0x1223456,wife是0x67890;那么这就相当于整形的交换,所以自然就要想传入&a一样传入&husband的值,更加形象一点的像这样:&a------>a=44,&b-------->b=5;要交换则swap(&a,&b,sizeof int); &husband-------->husband------->"willom"
;其中husband不等于willom,而是指向willom,这就是跟a=4,而不是a指向4最大的不同。
浙公网安备 33010602011771号