美文网首页C语言学习C/C++程序员
C语言从零开始(十八)-指针3

C语言从零开始(十八)-指针3

作者: 天花板 | 来源:发表于2016-01-07 12:33 被阅读1460次

今天我们继续通过例题来完成指针相关知识点的讲解。

指针与字符串

请看下面这两句代码:

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

相关文章

  • C语言从零开始(十八)-指针3

    今天我们继续通过例题来完成指针相关知识点的讲解。 指针与字符串 请看下面这两句代码: 请问c和*p有什么区别? 代...

  • C语言05- 指针

    C语言05- 指针 13:指针 指针是C语言中的精华,也是C语言程序的重点和难点。 13.1:指针定义与使用 指针...

  • C语言指针3

    int main() { int a[5] = {1,3,5,7,9}; int *num[5] = {&a[0]...

  • Go语言基础之指针

    区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。 要搞明白Go语言中的指针需要先知道3个...

  • 02-C语言的指针

    02-C语言的指针 目标 C语言指针释义 指针用法 指针与数组 指针与函数的参数 二级指针 函数指针 指针在C中很...

  • 维护中-1

    此文章已经移至 C语言从零开始(十)-循环基础for 上一篇:C语言从零开始(九)-选择结构下一篇:C语言从零开始...

  • C语言指针总结大学霸IT达人

    C语言指针总结大学霸IT达人 C语言的指针是C语言区别其它语言的最主要的特定之一。有了指针,C语言就可以抛开所有束...

  • 带小白学C语言指针

    C语言里指针才是C语言的开始和指针;C语言里基本所有东西都是由指针演变而成; 指针是指向地址的变量,类型就是指针...

  • 在Swift中使用C语言的指针

    在Swift中使用C语言的指针 在Swift中使用C语言的指针

  • [Swift]结构体指针操作

    C语言的指针操作 在c语言中申明一个变量并通过指针修改该变量的值 a value is 2 c语言操作结构体指针操...

网友评论

  • 鱼根尾:为什么0x18要转化为十进制再除以四
  • dreamruner:怎么没有了啊?
  • Hello_kid:0x18为什么是24字节呢?
    天花板:@Ruiz678 0x是十六进制啊
  • Chris_R:学习的路上,感谢有你
  • 面包橙汁:字符串这个复制函数我没太看懂,如果可以的话,能给个解释吗
    Chris_R:@天花板 写错了 应该是*dest = *src,太粗心了,多谢提醒!:blush::blush:
    天花板:@五彩的瓜牛 dest=src是不对的,你再想想
    Chris_R:@面包橙汁 从逻辑角度分析,应该先dest=src,然后各自指针向后移动一位,直到src=/0的时候,退出
  • 龙君璃:还会更新吗?
  • 悟空皆空:怎么没有十九啦T^T

本文标题:C语言从零开始(十八)-指针3

本文链接:https://www.haomeiwen.com/subject/zssfkttx.html