【C语言】深入解开指针(四)1

简介: 【C语言】深入解开指针(四)

前言

通过对前面指针的学习,你可能对指针有了一些理解,比如,数字名的理解,然后怎么使用指针来访问数组,二级指针,指针数组 …


有了这些的理解,本小节我们继续深入理解指针,啊森将会带你理解字符指针变量,数组指针变量,二维数组传参的本质,函数指针变量和函数指针数组,通过这些学习,我们最后来通过这些知识来实现转移表,话不多说,让我们启航!

一、🚣 字符指针变量

在C语言中,字符指针变量是一种指向字符型数据的指针变量。它可以用来指向一个字符数组的首地址,也可以用来指向一个字符型变量的地址。

指针类型为字符指针 char*

字符指针变量的声明和初始化如下所示:

char str[] = "Hello"; // 声明一个字符数组
char *ptr; // 声明一个字符指针变量
ptr = str; // 将字符数组的首地址赋给字符指针变量

通过字符指针变量可以访问和操作字符数组中的元素,也可以通过指针运算来访问字符串中的字符。例如:

int main()
{
  char str[] = "Hello";
  char* ptr;
  ptr = str;
  printf("%c\n", *ptr); // 输出字符数组的第一个字符
  printf("%c\n", *(ptr + 1)); // 输出字符数组的第二个字符
  return 0;
}

当然,以上是把字符串放在字符数组里面,不过我们可不可以把字符串直接放在指针里面呢?当然可以!

int main()
{
  const char* pa = "hello,world";//这⾥是把⼀个字符串放到pa指针变量⾥了吗?
  printf("%s\n", pa);
  return 0;
}

思考:这⾥是把⼀个字符串放到pa指针变量⾥了吗?


当然不是!

–>代码 const char* pa = "hello,world"; 特别容易让同学以为是把字符串 hello,world 放

到字符指针 pa ⾥了,但是本质是把字符串 hello,world. ⾸字符的地址放到了pa中。

这个是内存布局,"hello,world"是一个字符串常量,它的值存储在内存中,而pa是一个指向这个字符串常量的指针,它的值是字符串常量的地址。所以pa存储的值是104,也就是"hello,world"的第一个字符的ASCII码值,以此我们就可以通过第一个字符串常量的地址遍历后面的字符,顺藤摸瓜的找到字符"\0"才停止。


总结:代码的意思是把⼀个常量字符串的⾸字符 h 的地址存放到指针变量 pa 中。

《剑指Offer》中收录了一道和字符串相关的笔试题,让我们一起来学习一下:

#include <stdio.h>
int main()
{
  char str1[] = "hello bit.";
  char str2[] = "hello bit.";
  const char* str3 = "hello bit.";
  const char* str4 = "hello bit.";
  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;
}

这个代码打印结果不一样的原因是:

str1 和 str2 是字符数组,它们分别用"hello bit."初始化了两个不同的数组。虽然内容相同,但它们占用的内存地址是不同的,所以str1 == str2 判断为不相等,打印"str1 and str2 are not same"。


str3 和 str4 是字符指针,它们都指向同一个字符串常量"hello bit."。字符串常量存储在只读内存区域,无论如何定义,它们的地址是相同的。所以str3 == str4 判断为相等,打印"str3 and str4 are same"。


换句话说:


- 字符数组比较地址,地址不同就不相等。


- 字符串常量比较内容,内容相同就相等。


所以结果不同的原因是str1、str2是数组,str3、str4是指针,它们的比较规则不同。


如果将str3和str4也定义为字符数组,则它们的比较结果也会是不相等,打印"str3 and str4 are not same"。



【C语言】深入解开指针(四)2:https://developer.aliyun.com/article/1474726

相关文章
|
14天前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
66 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
14天前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
41 9
|
14天前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
38 7
|
24天前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
86 13
|
17天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
17天前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
50 3
|
18天前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
17天前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
31 1
|
21天前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
21天前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。