今天我们继续通过例题来完成指针相关知识点的讲解。
指针与字符串
请看下面这两句代码:
char c = 'a';
char* p = "a";
请问c和*p有什么区别?
代码中有两个变量,一个是字符变量c,一个是字符指针p。c中保存了一个字符a,p指向了一个2Bytes的栈空间,里面保存了两个字符,一个是'a'另一个是'\0'。如果我们用printf打印出它们,会是这样的结果。
printf("%c\n", c);
printf("%c\n", *p);
printf("%s\n", p);
请大家自己查看打印结果。你们会发现其实从打印结果上根本看不出它们的区别。
这个简单的问题涉及到了以下知识:
- 字符常亮和字符串常亮的表示有区别,用单引号''和双引号""区分
- 声明字符指针时可以让它直接指向一个字符串常亮,但这个指针的内容不可修改
-
字符串在内存中所占空间总比字符数多一个'\0',如下图:
- 字符的打印和字符串的打印有区别
指针变量与普通变量
请看下面这段代码:
int main()
{
int x, *p;
p = &x;
*p = 0;
printf("x:%d\n", x);
printf("*p:%d\n", *p);
*p += 1;
printf("x:%d\n", x);
(*p)++;
printf("x:%d\n", x);
return 0;
}
这是一道很简单却很经典的题目,大家应该都知道它的结果。
这道题考察的知识是如何使用指针管理普通变量的空间。在程序开始时,声明了一个int型变量x,它拥有一个内存中的sizeof(int)大小的空间。之后,我们又用指针p指向了这块空间,也就是把x的地址保存在了指针变量p中。
后面的操作全部针对指针变量p所指向的空间,于是变量x就跟着发生了变化。这个原理是必须要掌握的。
指针运算
请看下面这段代码:
int main()
{
int *np1, *np2, nValue;
char *cp1, *cp2, cValue;
np1 = (int*)0x500;
np2 = (int*)0x518;
nValue = np2 - np1;
cp1 = (char*)0x500;
cp2 = (char*)0x518;
cValue = cp2 - cp1;
printf("%d, %d", nValue, cValue);
return 0;
}
这道题也是一道经典题目,经常出现在大公司的程序考试中。你知道答案是多少吗?应该是6,24。
对于整型指针,它的移动的基本单位是4Bytes,因此
nValue = 0x518 - 0x500 = 0x18 = 24(Bytes)
也就是6个单位。
而cValue同样是24,但char类型指针的基本单位是1Bytes,因此打印结果为24。这种方法经常被用在指针操作内存中,请看下面这段代码。
int main()
{
char* pStr = "Hello World!";
char* p = pStr;
while(*p != '\0')
{
p++;
}
printf("The length of string : %d", p - pStr);
return 0;
}
这段代码通过指针之间的运算打印出了字符串的长度。
字符串复制
这个功能是C语言考试中最常见的题目,要求写出一个最简单效率最高的字符串复制函数。代码如下:
char* strcpy(char* pDest, char* pSrc)
{
char* p = dest;
while(*src != '\0')
{
*dest++ = *src++;
}
return p;
}
这段代码看着非常简单,相信大家也能看懂。但如果让你来写,你是否能在最短的时间内写出这段代码呢?这就需要功力了。
这篇的最后,我想说,学习编程没有捷径,只有把那些你不屑一顾的小代码反复练习才能拥有一个扎实的基本功。之后,你才能在这条路上走的更远。
我是天花板,让我们一起在软件开发中自我迭代。
如有任何问题,欢迎与我联系。
上一篇:C语言从零开始(十七)-指针2