【C语言进阶】 带你玩转指针(一)

简介: 【C语言进阶】 带你玩转指针(一)

一、字符指针

一般使用:

int main()
{
  char ch = 'w';
  char* pc = &ch;
  return 0;
}

91d92d31778f42928055119cb90bdb6e.png

进阶使用:

int main()
{
  const char* p = "abcd";//字符串常量的值是首字符的地址,
  //由于p指向的是常量字符串,所以*p解引用的时候不能改变这个字符串,所以前面用const来修饰
  printf("%s\n", p);
  //打印字符串只需要知道字符串首字符的地址,然后就会一直往后打印直到遇到'\0'为止
  //如果这里没有const修饰,通过解引用修改字符串常量程序会崩溃
  /*char* p = "abcd";
  *p='wcvb';
  printf("%s\n", p);*/
  //这三段代码执行后,虽然程序不会报错,但是会崩溃
  //加了const修饰后,再通过解引p用去改变字符串常量程序就会报错
  //*p = "dvcb";此时程序报错
  return 0;
}

经典例题:

//一个例题:
int main()
{
    char str1[] = "hello word.";
    char str2[] = "hello word.";
    //这两段代码执行后会在内存中创建两个数组,这两个数组有各自的空间
    const char* str3 = "hello word.";//字符常量一般是放在内存中的只读常量区
    const char* str4 = "hello word.";
    //"hello word."是一个常量字符串,永远不可能被修改掉,所以就没有必要创建两份,大家都共用这一份
    //str3 和 str4里面存的都是 'h'的地址
    if (str1 == str2)//数组名表示的是首元素的地址,由于两个数组开辟了各自的空间,所以它们首元素的地址一定不相同
        printf("str1 and str2 are same\n");
    else
        printf("str1 and str2 are not same\n");
    if (str3 == str4)//str3 和 str4里面存的都是 'h'的地址,所以它们两个的值是相等的
        printf("str3 and str4 are same\n");
    else
        printf("str3 and str4 are not same\n");
    //因为str3 和 str4里面存的都是 'h'的地址,我们可以把这个地址打印出来
    //结果显示这两个地址是相同的
    printf("%p\n", str3);
    printf("%p\n", str4);
    return 0;
}
//结果:
str1 and str2 are not same
str3 and str4 are same
00C27BD8
00C27BD8

85b8b4dd0d7742bba7af889750fb27b9.png

二、指针数组

关于指针数组到底是指针还是数组?交给大家一个简单的方法:看后缀!这里的后缀是数组,就可以十分确定,指针数组其实就是数组。这里的指针我们可以看成是形容词,用来修饰数组的,就像整型数组:表示这个数组是用来存放整形数据的,字符型数组:表示这个数组是用来存放字符型数据的。同理:指针数组就表示这个数组是用来存放指针(地址)的。指针又分为:整型指针、字符指针等等,这也就导致指针数组也会分出很多的种类。

字符型指针数组:

 用来存放字符地址的数组

//指针数组
int main()
{
  const char* arr[4] = {"abcd","bcde","nmjh","lkju"};
  //这就是字符型指针数组,这有一个叫arr的数组,它可以存放4个元素,每个元素都是 字符指针(存放的就是字符的地址)
  //数组中的4个元素都存的是字符串常量的首字符地址,由于指向的是字符串常量,不可被修改,所以加上const修饰
  //打印出首元素的地址,发现字符串常量在内存中不是连续存放的
  /*printf("%p\n", "abcd");
  printf("%p\n", "bcde");
  printf("%p\n", "nmjk");
  printf("%p\n", "lkju");
  printf("\n");*/
  int i = 0;
  for (i = 0; i < 4; i++)
  {
    printf("%s\n", arr[i]);//调用数组中的元素
  }
  return 0;
}


f9bdc94639f84d67b55be6616635457d.png

int* arr1[10]; //整形指针的数组
char *arr2[4]; //一级字符指针的数组
char **arr3[5];//二级字符指针的数组

整型指针数组:

 用来存放整型地址的数组

//整型指针数组
//这里有一个数组,里面存的都是整型指针(整形的地址)
int main()
{
  int arr1[5] = { 1,2,3,4,5 };
  int arr2[5] = { 6,5,4,3,2 };
  int arr3[5] = { 10,9,1,2,5 };
  //创建三个整型指针
  int* arr[3] = { arr1,arr2,arr3 };//数组名表示首元素地址
  //这里有一个数组arr,它能够存储三个元素,每一个元素的类型都是整型指针(int*)(整形的地址)
  //arr1 - 1的地址
  //arr2 - 6的地址
  //arr3 - 10的地址
  int i = 0;
  for (i = 0; i < 3; i++)
  {
    int j = 0;
    for (j = 0; j < 5; j++)
    {
      //printf("%d ", arr[i][j]);
      printf("%d ", *(arr[i] + j));//arr[i]拿到的是数组首元素的地址,那再加j,就是跳过j个整型,就可以访问数组中的其他元素了。
    }
    printf("\n");
  }
  return 0;
}

927269fbdc5f41e591f027ef0455d10f.png




目录
相关文章
|
2月前
|
C语言
【c语言】指针就该这么学(1)
本文详细介绍了C语言中的指针概念及其基本操作。首先通过生活中的例子解释了指针的概念,即内存地址。接着,文章逐步讲解了指针变量的定义、取地址操作符`&`、解引用操作符`*`、指针变量的大小以及不同类型的指针变量的意义。此外,还介绍了`const`修饰符在指针中的应用,指针的运算(包括指针加减整数、指针相减和指针的大小比较),以及野指针的概念和如何规避野指针。最后,通过具体的代码示例帮助读者更好地理解和掌握指针的使用方法。
54 0
|
19天前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
72 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
19天前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
44 9
|
19天前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
40 7
|
29天前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
101 13
|
22天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
23天前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
70 3
|
23天前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
29天前
|
存储 C语言 开发者
C 语言指针与内存管理
C语言中的指针与内存管理是编程的核心概念。指针用于存储变量的内存地址,实现数据的间接访问和操作;内存管理涉及动态分配(如malloc、free函数)和释放内存,确保程序高效运行并避免内存泄漏。掌握这两者对于编写高质量的C语言程序至关重要。
52 11
|
23天前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
34 1