【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




目录
相关文章
|
1月前
|
存储 C语言
【C语言篇】深入理解指针3(附转移表源码)
【C语言篇】深入理解指针3(附转移表源码)
35 1
|
17天前
|
C语言
【c语言】指针就该这么学(1)
本文详细介绍了C语言中的指针概念及其基本操作。首先通过生活中的例子解释了指针的概念,即内存地址。接着,文章逐步讲解了指针变量的定义、取地址操作符`&`、解引用操作符`*`、指针变量的大小以及不同类型的指针变量的意义。此外,还介绍了`const`修饰符在指针中的应用,指针的运算(包括指针加减整数、指针相减和指针的大小比较),以及野指针的概念和如何规避野指针。最后,通过具体的代码示例帮助读者更好地理解和掌握指针的使用方法。
43 0
|
16天前
|
C语言
【c语言】指针就该这么学(3)
本文介绍了C语言中的函数指针、typedef关键字及函数指针数组的概念与应用。首先讲解了函数指针的创建与使用,接着通过typedef简化复杂类型定义,最后探讨了函数指针数组及其在转移表中的应用,通过实例展示了如何利用这些特性实现更简洁高效的代码。
12 2
|
17天前
|
C语言
如何避免 C 语言中的野指针问题?
在C语言中,野指针是指向未知内存地址的指针,可能引发程序崩溃或数据损坏。避免野指针的方法包括:初始化指针为NULL、使用完毕后将指针置为NULL、检查指针是否为空以及合理管理动态分配的内存。
|
17天前
|
C语言
C语言:哪些情况下会出现野指针
C语言中,野指针是指指向未知地址的指针,通常由以下情况产生:1) 指针被声明但未初始化;2) 指针指向的内存已被释放或重新分配;3) 指针指向局部变量,而该变量已超出作用域。使用野指针可能导致程序崩溃或不可预测的行为。
|
23天前
|
存储 C语言
C语言32位或64位平台下指针的大小
在32位平台上,C语言中指针的大小通常为4字节;而在64位平台上,指针的大小通常为8字节。这反映了不同平台对内存地址空间的不同处理方式。
|
23天前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
23天前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
24天前
|
C语言
C语言指针(3)
C语言指针(3)
11 1
|
24天前
|
C语言
C语言指针(2)
C语言指针(2)
12 1
下一篇
无影云桌面