【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

相关文章
|
5天前
|
C语言
c语言指针总结
c语言指针总结
15 1
|
17小时前
|
C语言
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror(下)
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror
5 0
|
17小时前
|
安全 C语言
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror(中)
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror
9 0
|
17小时前
|
C语言
C语言进阶⑫(指针下)(指针和数组笔试题解析)(杨氏矩阵)(中)
C语言进阶⑫(指针下)(指针和数组笔试题解析)(杨氏矩阵)
10 0
|
17小时前
|
C语言
C语言进阶⑫(指针下)(指针和数组笔试题解析)(杨氏矩阵)(上)
C语言进阶⑫(指针下)(指针和数组笔试题解析)(杨氏矩阵)
10 0
|
4天前
|
存储 安全 编译器
C语言详解指针(指针海洋的探索,将传值与传址刻在心里)
C语言详解指针(指针海洋的探索,将传值与传址刻在心里)
9 0
|
5天前
|
C语言
C语言(指针详解)重点笔记:指针易错点,都是精华
C语言(指针详解)重点笔记:指针易错点,都是精华
13 0
|
5天前
|
存储 C语言
C语言指针讲解(适用于初学者)
C语言指针讲解(适用于初学者)
6 0
|
5天前
|
存储 程序员 C语言
【C 言专栏】C 语言指针的深度解析
【4月更文挑战第30天】C 语言中的指针是程序设计的关键,它如同一把钥匙,提供直接内存操作的途径。指针是存储其他变量地址的变量,通过声明如`int *ptr`来使用。它们在动态内存分配、函数参数传递及数组操作中发挥重要作用。然而,误用指针可能导致错误,如空指针引用和内存泄漏。理解指针的运算、与数组和函数的关系,以及在结构体中的应用,是成为熟练 C 语言程序员的必经之路。虽然挑战重重,但掌握指针将增强编程效率和灵活性。不断实践和学习,我们将驾驭指针,探索更广阔的编程世界。
|
5天前
|
算法 搜索推荐 程序员
C语言中的函数指针和回调函数
C语言中的函数指针和回调函数
12 2