首页 > 其他分享 >C语言指针进阶(一)

C语言指针进阶(一)

时间:2023-03-13 20:32:46浏览次数:41  
标签:字符 进阶 int C语言 char 地址 数组 指针

前言

什么是指针?指针就是一个可以存储地址的变量。当我们将具体的某个对象的地址存放到某个指针变量当中时,我们可以说将某个对象的地址存放到某个指针当中,也可以说指向某个对象的某个指针,通过指针变量存储的地址我们可以找到并修改与地址相对应的内容,地址就相当于人的身份证,通过解读身份证的信息,我们既可以找到身份证主人的家庭地址也可以获得该身份证对应的其他信息,而在C语言中,万事万物都有地址,地址是可以识别它们身份的标识

任何一个指针类变量所占的字节大小为4(32位系统)或者是8(64位系统)

一、字符指针

作用:存放某个字符的地址或者某个字符串的首地址

1.1存放某个字符的地址

char ch='a'; //创建一个char类型的变量 ch
char * p=&ch;//将ch变量的地址存放到字符指针p中去

1.2存放某个字符串的首地址

const char *p="abcdef";
//将常量字符串首字符a的地址存放到字符指针p当中去,注意这里并不是存放整个
常量字符串的地址,而常量字符串无法被修改,因此加上const确保其权限为只读(
不能被修改)

1.3闲言碎语

当用一个常量字符串去初始化俩个不同的字符数组时,会开辟不同的空间

而当用一个常量字符串去初始化两个不同的字符指针时,开辟的空间是相同的

二、数组指针和指针数组

牢记:数组指针是指针,因为指针在后,指针数组是数组,因为数组在后,它们前面的词只是一个修饰

会不会有这样一个疑问,指针不就是指针,数组不就是数组,怎么多出来一个数组指针和指针数组

2.1数组类型简单剖析

其实,我们通常说的数组,一般是字符数组char a[];或者是整型数组int b[];由于我们前期学习的知识较少,所以对数组的类别没有一个概念,比如说:

字符数组本质就是一个数组,那我们为什么叫它字符数组呢?这是因为这个数组里存放的数据类型是字符类型(char),它是存放字符数据的数组,所以称之为字符数组,

小提示:把定义的数组拿走后,剩下的是数组元素的类型

char a[3]={0};我们定义了一个有3个char类型元素的字符数组,并初始化为0,我们拿走数组a[3]后,只剩下char,char为数组元素的类型

指针数组也是同理,它也仅仅只是一个数组,只不过它存储的是指针类型的数据,例如,

char* a[3]={0};[]的优先级高于*,因此a和[]结合,是一个数组,我们把a[3]拿走后,剩下char*,char*就是该数组元素的类型

2.2指针类型简单剖析

同理,数组指针和普通的int*,char* 类型的指针一样,它们都仅仅只是一个指针,只不过int* 类型的指针,它指向的对象是int类型,而char*类型的指针指向的对象是char类型,而最终的数组指针,它指向的对象是数组类型,因此称之为数组指针,

小提示:我们拿出定义指针的语句,去掉指针后,就是指针指向对象的类型

一个简单的数组指针如下,

int arr[3]={0};
int (*p)[3];
//()的优先级高于[],因此p和*结合,p是一个指针,把(*p)拿走后,剩下
int [3],代表指针指向的是一个有三个元素的数组,数组中每个元素的类型是

2.3数组名的代表含义

只有在sizeof(数组名)和&(数组名)的时候,数组名才代表的是整个数组

此外的所有情况,数组名代表的都是首元素地址

2.4数组指针的使用

在使用数组指针之前,我们必须清楚,二维数组是由一个个一维数组组成的,也就是说,二维数组的每个元素都是一维数组,那么

二维数组的数组名代表的也是首元素地址,也即是一维数组的地址,而我们又知道,数组指针可以存储数组的地址,

因此,在二维数组传参的时候,我们可以用一个数组指针来接受这个二维数组的首元素地址,代码如下

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

void test(int (*arr)[3],int row,int col)
//形参用数组指针来接收二维数组首元素地址
{

int i = 0, j = 0;

for (i = 0; i < row; i++)

{

for (j = 0; j < col; j++)

{

printf("%d ", arr[i][j]);

}

printf("\n");

}


}

int main()

{

int arr[2][3] = { {1,2,3},{4,5,6} };

test(arr,2, 3);

}

代码结果如下:

C语言指针进阶(一)_数组指针

三、牛刀小试

来看这样几个代码,来分析它的涵义

int arr[5];
//代表一个有5个整型元素的整型数组
int *parr1[10];
//代表一个有10个int*类型的指针数组
int (*parr2)[10];
//代表一个指向一个有10个整型元素的数组的指针
int (*parr3[10])[5];
//利用小提示,[]的优先级更高,所有它是一个数组,去掉parr3[10]后,就是数组
元素的类型,int (*) [5],这是数组指针类型,该指针指向的是有5个整型元素的数组
因此,最后一行代码表示的是一个拥有10个函数指针元素的数组


四、小小提议

遇到的疑问,自己要动手去实践和观察




标签:字符,进阶,int,C语言,char,地址,数组,指针
From: https://blog.51cto.com/u_15466618/6118652

相关文章

  • 指针的运算
    1、指针关系运算比较两个指针(地址)的大小2、指针加减整数运算根据指针的类型,判断指针加减整数的步长。3、指针-指针的运算指针减去指针得到的是两个指针之间相差的元素个数!指......
  • CH582 CH592 CH573 PC指针打印(排查程序运行+死循环指示)
    代码调试如果需要程序死循环,又不晓得停在哪,可以通过打印PC指针进行定位,具体方法如下比如开启看门狗中断,开发方法参考CH573CH582CH579看门狗使用-debugdabiaoge-博......
  • 无法获取本地变量或参数的值,因为它在此指令指针中不可用,可能是因为它已经被优化掉了
    问题:调试时,变量的值无法显示,打印变量值提示"无法获取本地变量或参数的值,因为它在此指令指针中不可用,可能是因为它已经被优化掉了"。解决办法:取消"优化编码"勾选框勾选状......
  • c语言二维数组如何转成一维使用
    //直接操作a,比如a[0]得到{0,1,2,3},a[1]得到{4,5,6,7},a[2]得到{8,9,10,11}inta[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};int*p1=a;......
  • Linux & 标准C语言学习 <DAY11>
    一、指针  1、什么是指针    指针是一种特殊的数据类型,使用指针可以定义指针变量,指针变量存储的是整形数据,该数据代表了内存的编号(地址),可以通过这个编号......
  • C语言—文件操作
    一、为什么使用文件我们前面学习结构体时,写了通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据白然......
  • C语言之整型提升
    一、什么是整型提升如果用一句话来说明整型提升那就是:只要是char类型和short类型的数据,   并且被使用或者说是只要参与运算,那么它们就会发生整型提升,被转化为普通整型......
  • 指针类型转换:reinterpre_cast
    指针类型转换:reinterpre_cast//用于指针类型之间的转换//用于整数和指针类型的转换//原理是直接从二进制位进行复制,是一种极其不安全的转换int*p=reinterpre_cas......
  • C语言中的const
    C语言中的constconst修饰的全局变量保存在常量区,不可通过任何方式改变其值const修饰的全局变量链接属性为外部链接属性const修饰的局部变量保存在栈区,不可通过变量名直......
  • 代码随想录day 6|指针总结
    环形链表题目链接:142、环形链表Ⅱ题目描述:给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回null。为了表示给定链表中的环,使用整数pos来表示链表尾连......