深入理解C语言指针——挑战C指针笔试题(1)

76 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情

:alarm_clock: 写在前面

大家对于指针恐怕都不陌生! 没学过C语言那也一定听过指针吧,指针是C最强的优势,学不明白也就成了劣势!大家不必害怕,指针并没有那么恐怖,掌握了指针,让你的C语言更上一层楼! bug郭和你一起将指针进阶学习一遍,一起加油!

在这里插入图片描述

:zzz: 本章介绍

可能有伙伴就要问了,咋一来就进阶指针! 不要慌问题不大,bug郭之前就写个一篇博客,介绍指针基础知识! 有兴趣的伙伴可以点击查看C语言指针,楼下大爷都能学会的小细节(和bug郭一起学C系列),建议收藏! 大家都复习完了指针基础吧,那我们就开始指针进阶的学习吧!

指针基础的一些概念:

  1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
  2. 指针的大小是固定的4/8个字节(32位平台/64位平台)。
  3. 指针是有类型,指针的类型决定了指针的+-
  4. 整数的步长,指针解引用操作的时候的权限。
  5. 指针的运算。

本章重点 6. 字符指针 7. 数组指针 8. 指针数组 9. 数组传参和指针传参 10. 函数指针 11. 函数指针数组 12. 指向函数指针数组的指针 13. 回调函数 14. 指针和数组面试题的解析

字符指针

字符指针顾名思义就是一个指针变量,指针指向的空间存放的是一个字符!

char* 字符指针

//基本用法
int main()
{
  char ch = 'c';
  char* pc = &ch;   
  *pc = 'w';
	return 0;
}

这种基本的用法,bug就不介绍了,相信大家都会!

//进阶
int main()
{	
	char* pstr = "abcdef"; 
	//pstr字符指针存了字符串,第一个字符(a)的地址
	printf("%s",pstr);
	return 0;
}

代码char* pstr = "abcdef"; 特别容易让我们以为是把字符串abcedf放到字符指针pstr里了,但是本质是把字符串abcdef 首字符的地址放到了pstr中。 在这里插入图片描述 我们可以知道通过字符指针pstr我们可以找到字符串abedef为啥我们不直接创建一个字符串变量,而要用这种方式,有何不同呢?

//测试
#include <stdio.h>
int main()
{
    char str1[] = "hello world.";
    char str2[] = "hello world.";
    char *str3 = "hello world.";
    char *str4 = "hello world.";
    if(str1 ==str2)
        printf("str1 and str2 are same\n");
    else
        printf("str1 and str2 are not same\n");
       
    if(str3 ==str4)
        printf("str3 and str4 are same\n");
    else
        printf("str3 and str4 are not same\n");
       
    return 0;
}

输出结果

在这里插入图片描述 可以看到,字符数组str1str2不相同,因为str1str2是数组名,而数组名就是第一个数组的地址。str1str2分别开辟了两个数组空间,只不过它们存放的内容一样而已! 而str3str4它们都是指向的同一块空间,因为它们指向的是字符串常量hello world.

这里str3str4指向的是一个同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域, 当几个指针。指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以str1str2不同,str3str4不同。 在这里插入图片描述

在这里插入图片描述