C语言指针之 进阶(上)

简介: C语言指针之 进阶

前言

今天来较为深入的介绍一下指针,希望大家能有所收获~

那么,先进行一些简单的基础知识复习吧。

字符指针

格式:char *

补充:

表达式“abcdef”的值是首字符a的地址

所以当像下面这么使用时,它的含义是:

char *pc = “abcde”

pc存储的是a的地址

printf(“%s”, p);

打印出的abcde

提示:

此处可以理解为将abcde存储在一个数组里面,数组名就是首元素地址

那么由此可以引出一个比较少见的写法:


         

输出的是c

注意

因为字符串“abcde”是常量,不可改变,但是,p作为指针变量是可以改变的,这时候改变p指向的对象程序就会报错。

所以最后在*左边加上const,使p指向的对象不可改变

一道题:

看下面这段代码:

问:输出结果是什么

#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;
}

运行结果:

知识点:

当两个常量数组相同时,只会储存一份,

所以,虽然创建了两个变量,但存储的是同一个地址(同一个值)

图解:

指针数组

定义:存放指针的数组

用途:

可以用指针数组模拟一个二维数组

如下:

int main()
{
  int arr1[] = { 1,2,3,4,5 };
  int arr2[] = { 2,3,4,5,6 };
  int arr3[] = { 3,4,5,6,7 };
  int* arr[] = { arr1, arr2, arr3 };
  int i = 0;
  return 0;
}

数组指针

定义:指向数组的指针

格式(唯一):

存储元素的类型 (*p)[数组大小] = &arr

注意:要明确指定出数组的大小,如果不写就默认为0,程序会报错。

但数组指针的使用不常见,

因为当对数组指针进行解引用后,就是数组名,多此一举。

就算使用,也大多用于二维数组,下面举个例子

void print(int (*p)[5], int r, int c)
{
  int i = 0;
  for (i = 0; i < 3; i++)
  {
    int j = 0;
    for (j = 0; j < 5; j++)
    {
      printf("%d ", p[i][j]);
    }
    printf("\n");
  }
}
int main()
{
  int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
  print(arr, 3, 5);
  return 0;
}

此处数组名指向的是二维数组的第一行

这里传递的 arr,也就是第一行的地址,是一维数组的地址

此处用数组指针来接收。

旧识新知

数组名指的是首元素的地址,

但有两个例外

1.sizeof(数组名)此处指的是整个数组

2.&数组名

取出的是数组的地址

那么创建一个变量存储数组的地址,他就是数组的指针,简称数组指针

但是 此处需要注意区分数组名和取地址数组名,虽然在打印时二者是一样的,但在运算时,因为 &arr 表示的是 数组的地址 ,所以它是以整个数组大小去运算的,而不是数组中首元素的大小

示例如下:

#include <stdio.h>
int main()
{
 int arr[10] = { 0 };
 printf("arr = %p\n", arr);
 printf("&arr= %p\n", &arr);
 printf("arr+1 = %p\n", arr+1);
 printf("&arr+1= %p\n", &arr+1);
 return 0;
}

运行结果:

这样就能直观的看出二者的区别

一组辨析

大家可以思考一下下面几行的代码的含义是什么

int arr[5];
int *parr1[10];
int (*parr2)[10];
int (*parr3[10])[5];

解释:


相关文章
|
1月前
|
存储 编译器 C语言
【C语言】【指针1】指针难?看这个就够了!
【C语言】【指针1】指针难?看这个就够了!
|
2天前
|
存储 C语言
【C语言基础】一篇文章搞懂指针的基本使用
本文介绍了指针的概念及其在编程中的应用。指针本质上是内存地址,通过指针变量存储并间接访问内存中的值。定义指针变量的基本格式为 `基类型 *指针变量名`。取地址操作符`&`用于获取变量地址,取值操作符`*`用于获取地址对应的数据。指针的应用场景包括传递变量地址以实现在函数间修改值,以及通过对指针进行偏移来访问数组元素等。此外,还介绍了如何使用`malloc`动态申请堆内存,并需手动释放。
|
5天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
10天前
|
存储 安全 C语言
C语言 二级指针应用场景
本文介绍了二级指针在 C 语言中的应用,
|
1月前
|
C语言
C语言------指针
这篇文章是关于C语言中指针的实训,通过示例代码展示了指针的基本概念、定义、赋值、使用和传递,以及指针运算和指针在函数参数中的应用,如交换两个变量的值和找出两个数中的较小值。
C语言------指针
|
26天前
|
存储 编译器 C语言
【C语言篇】深入理解指针2
代码 const char* pstr = "hello world."; 特别容易让初学者以为是把字符串 hello world.放 到字符指针 pstr ⾥了,但是本质是把字符串 hello world. 首字符的地址放到了pstr中。
|
26天前
|
存储 程序员 编译器
【C语言篇】深入理解指针1
assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报错终⽌运⾏。这个宏常常被称为“断⾔”。
|
29天前
|
存储 搜索推荐 C语言
C语言中的指针函数:深入探索与应用
C语言中的指针函数:深入探索与应用
|
1月前
|
存储 编译器 C语言
【C语言】指针练习题目
【C语言】指针练习题目
|
1月前
|
C语言 Python
C语言指针(2)
C语言指针(2)
23 5