学习笔记——C语言基本概念指针(下)——(8)

news2024/11/26 13:33:38

1.指针和数组

        数组指针 -- 指向数组的指针。

        指针数组 -- 数组的元素都是指针。

换句话理解就是:数组指针就是个指针,指针数组就是个数组。

  

1.1数组指针

数组指针:指向数组的指针;

先回顾一下数组的特点:
        1.相同数据类型的若干个元素

        2.元素的地址空间连续

        3.数组名是数组的首元素地址,也是整个数组的首地址。

1.1.1 指针指向一维数组

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

先定义一个整形的数组名字为num,其中有6个元素。

回顾一下指针的定义: 指针指向的空间类型 *变量名

int *P=num;        单独的数组名仅仅表示首元素的地址,p指向首元素,所以指针指向的空间数据类型就是首元素类型。

举例说明:
int num[6] = {1,2,3,4,5,6}

int *p =num;

        p:存放的是首元素的地址;        *p得到的是num[0];

在这里我的理解就是,指针指向的是数组的首元素,也就是存放的是首元素的地址,而使用*号就是对这个指针进行解码操作,得到里面的信息,也就是对应数数组的第一个元素num[0].

        p的数据类型是:int *。

我的理解就是:根据定义,p指针指向的空间类型,换句话说就是,指针p后面跟的是谁,它是什么数据类型,那么p所指向的数据类型就是什么,那为什么p的数据类型是int *?因为更具数据类型判断的定义,去掉变量名剩下的全是数据类型所以是int *

        p+1操作,是以int为单位的+1,一个int是四个字节。 *(p+3)得到的就是num[3]:4。

那为什么会是这样的了?p指针是指向地址,p的偏移是在对应地址空间中进行,回顾指针的定义,指针元素是具有连续性。也就是说在现在这个存储的num[6]数组中,第0个元素和第一个元素之间是相差四个字节的,也就可以推出,当p以int为单位偏移3时,移动的是12个字节,每两个元素之间但是相差4字节。所以在对(p+3)进行解码时得到的是num[3]。

同理在进行数组取元素:num[4] = *(p+4)         *(num+4)==num[4]        p[4]==*(p+4)

         在库函数中指针的应用:

strlen(数组名); //数组名是首元素地址
strlen(char *s);

举例:

#include<stdio.h>
#include <string.h>
int main()
{

	char buf[32] = {"hello"};
	char *p = NULL;
	p = buf; //buf -- 首元素地址 &buf[0]
	scanf("%s",buf); //buf 是首元素地址这个性质
	printf("%s",p);
	return 0;	
} 

运行结果为你随意输入,然后输入的内容中会被指针p指向首元素地址,然后从这里开始依次写入。

补充:

int num[6] = {1,2,3,4,5,6};
int(*p)[6]=&num;

其中&num是整个数组的首地址,p指向的空间类型就是整个数组的类型。

p:指针        int(*)[6]

p指向的空间类型:int[6]

p+1        以6个int为单位+1

总结: int num[6];
        单独的数组名, num: 表示首元素地址
        &数组名, &num: 表示整个数组的首地址 ( 很少用! )
        区别:
                %p 打印 num 和&num 数值一样
                区别在于: &num+1 以 int [6] 为单位+1
                num + 1 以元素大小即 int 为单位+1

1.1.2指针指向二维数组

int num[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

在回指针的定义来看:指针指向的空间数据类型 * 变量名;

int(*p)[4]=num;

单独的数组名仅仅表示元素地址,p指向首元素,p指向的空间类型就是首元素类型;二维数组的首元素为num[0],类型是int[4],因此p指向的空间类型就是int[4]

打印 7: num[1][2]         *(*(p+1)+2)         p[1][2]         *(*(num+1)+2)
通式:
                num[i][j]           *(*(p+i)+j)            p[i][j]           *(*(num+i)+j)

1.2 指针数组

指针数组:数组的元素全是指针。

数值:元素的数据类型  变量名[元素个数];

举例说明:

char *s[4]={“hello”,“dbase”,“123”,“world”

s[0]: char * “hello”的首地址
s[1]: char * “dbase”的首地址
。 。 。
定义指针:指针指向数组,一维数组

指针指向的空间类型 *变量名;

char **p=s;//s数组名,数组的首地址。

        p指向数组的首元素,数组的首元素是char*

        指针指向的空间类型就是char*;

代码示例:

#include<stdio.h>
int main()
{
	char*a[]={"Pascal","Clanguage","dBase","Coble"};
	char (**p);
	int j;
	p = a + 3;
	for(j = 3; j >= 0; j--)
	printf("%s\n", *(p--));

} 

运行结果为:

数组的元素是指针: char * ptr[5] = {NULL};
这个一般用的不多,就不多介绍了。

2 C语言的五大区

栈区: 局部变量(自动开辟, 自动释放);
堆区: 预留给开发人员, 需要手动开辟 malloc, 手动释放 free;
全局区/静态区: 全局变量和静态变量(static)
常量区: 存放常量, 不能改变的量;
代码段: 存放二进制代码


3. 总结指针的定义


1--》 char *p = NULL;
2--》 char ch;
        char *p = &ch;
3--》 char buf[32] = {“hello”};//局部变量--“ hello” 栈区
        char *p = buf;
        小写的 e 改为 E
        buf[1] = ‘E’ *(p+1)=’E’;
4--》 用字符串初始化一个指针
        char *p = “hello”;//局部变量 -- p 有空间, 8 字节
        //p 里面存放的是常量区”hello”的首地址
        *( p+1) 打印出 ‘ e’
        想小写的 e 改为 E *(p+1)=’E’; //报错, 常量区不能被修改
5--》 char buf[3][80] = {0};
        char (*p)[80] = buf;

4 const

含义: 修饰变量, 使其只读
位置: 定义变量的时候
1--> const int num = 100; //const 修饰 num, num 只读
num = 200;//报错
2--> int num = 100;
const int *p = # //const 修饰*p, 仅仅不能通过 p 来修改 p 指向的空间的内容
3--> int num = 100;
int const *p = # //同 2》
4--> int num = 100, a = 200;
int *const p = # //const 修饰 p, p 的指向不能改变
p = &a; //报错
5--> int num = 100, a = 200;
const int *const p = #
第一个 const 修饰*p: 不能通过 p 改变 p 指向空间的内容
第二个 const 修饰 p, p 的指向不能改变;

关于指针的内容就分享到这里,其中大多数是我自己的理解如果有错误的地方,请在评论区指出。

今天依旧分享一张图片当结束吧。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1561179.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux权限提升总结

几个信息收集的项目推荐 运行这几个项目就会在目标主机上收集一些敏感信息供我们参考和使用 一个综合探针&#xff1a;traitor 一个自动化提权&#xff1a;BeRoot(gtfo3bins&lolbas) 使用python2运行beroot.py就可以运行程序&#xff0c;然后就可以收集到系统中的大量信…

Hive详解(5)

Hive 窗口函数 案例 需求&#xff1a;连续三天登陆的用户数据 步骤&#xff1a; -- 建表 create table logins (username string,log_date string ) row format delimited fields terminated by ; -- 加载数据 load data local inpath /opt/hive_data/login into table log…

【Java】反射简介,利用反射打印一个类当中的构造函数,方法和属性。

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 我想要通过反射来打印如下效果的类信息。 Student类如下代码所示。 package com.my.reflect;public class Student {public String name;public int age;public Student(){}public Student(String name, int age) {this…

探索组合总和问题(力扣39,40,216)

文章目录 题目前知LinkedList和ArryayList 组合总和I一、思路二、解题方法三、Code 组合总和II一、思路二、解题方法三、Code 组合总和III一、思路二、解题方法三、Code 总结 先看完上一期组合问题再看这一期更加容易理解喔&#x1f92f; 在算法和编程的世界中&#xff0c;组合…

走向国际:区块链行业项目海外市场宣传与运营攻略

随着区块链技术的不断发展和应用&#xff0c;越来越多的区块链项目开始将目光投向海外市场。在全球范围内寻找用户和投资者&#xff0c;扩大品牌知名度&#xff0c;是许多区块链项目的共同目标。然而&#xff0c;要成功进军海外市场&#xff0c;并不是一件容易的事情。本文将深…

Vscode运行python

按住 xtrlshiftp&#xff0c;会出现下面的界面&#xff1a; 然后选择第一个选项&#xff0c;会出现如下的界面&#xff1a; 选择某个环境后就可以使用了。可以右键&#xff0c;如下所示&#xff1a; 就可以运行python程序了

如何在Ubuntu系统部署Z-blog博客结合cpolar实现无公网IP访问本地网站

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

基于WEB的花卉养殖知识平台

基于WEB的花卉养殖知识平台的设计与实现 摘要 随着人们生活水平及生活质量要求的日益提升&#xff0c;花卉也成为了人们日常生活的调味剂&#xff0c;同时对于花卉的养殖及养护不再是老年人的专利&#xff0c;很多年轻人也在通过花卉的养护来舒缓工作压力&#xff0c;同时通过…

Centos7.X服务器搭建VOS系统的REC录音转换MP3,并支持外呼系统wav转换MP3

由于有的公司客户需要自己下载录音或做话务质检等工作需要&#xff0c;需要从VOS系统中把录音下载到其它服务器使用&#xff0c;但是VOS录音格式是REC格式的&#xff0c;就算下载下来了也无法直接播放&#xff0c;因此我们需要搭建一台转换MP3的服务器来完成需求&#xff01; 外…

EfficientSAM 项目排坑

EfficientSAM 项目排坑 任务过程记录创建环境运行示例 任务 跑通这个项目代码 过程记录 创建环境 readme里没有说具体怎么配置环境&#xff0c;所以可能对我来说还挺困难的。 现把项目git下来&#xff1a; git clone https://github.com/yformer/EfficientSAM.git cd Effi…

插值字符串格式化代码中的感叹号(Python)

在csdn上读到&#xff0c;插值字符串格式化代码中有“!”&#xff0c;进行了一番探究&#xff0c;了解到其中的一点“隐秘”&#xff0c;在此共享。&#x1f92a; (笔记模板由python脚本于2024年03月31日 09:27:59创建&#xff0c;本篇笔记适合对Python字符串格式化有一定认知的…

【C语言】联合体、枚举: 联合体与结构体区别,枚举的优点

目录 1、联合体 1.1、什么是联合体 1.2、联合体的声明 1.3、联合体的特点 1.4、联合体与结构体区别 1.5、联合体的大小 2、枚举 2.1、枚举类型的声明 2.2、枚举类型的优点 3、三种自定义类型&#xff1a;结构体、联合体、枚举 正文 1、联合体 1.1、什么是联合体 联…

OpenHarmony实战:命令行工具hdc安装应用指南

一、工具概述 hdc&#xff08;OpenHarmony Device Connector&#xff09;是为开发人员提供的用于设备连接调试的命令行工具&#xff0c;该工具需支持部署在 Windows/Linux/Mac 等系统上与 OpenHarmony 设备&#xff08;或模拟器&#xff09;进行连接调试通信。 简言之&#xf…

开启 Sora 知识免费课,探索文生视频大模型

4 月 1 日&#xff0c;中国网游先锋&#xff0c;火石控股董事长、风险投资人吴渔夫开启了“跟我学 Sora 知识”的免费课程。他表示&#xff0c;讲述的知识涵盖了 Sora 的产品、技术及未来走向。自 2 月 16 日 Sora 文生视频模型问世以来&#xff0c;我已查阅众多的 Sora 中英文…

记一次对Codis的无知引起的逻辑变更

先提前说明&#xff0c;对Codis的无知是因为Codis不支持一些Redis的命令&#xff0c;而这次的逻辑变更&#xff0c;就是因为使用了PUBLISH&#xff0c;而Codis又不支持PUBLISH导致的。 1. 前言 前段时间的一次需求中&#xff0c;因为设计到多个服务的注册问题&#xff0c;在项…

docker容器添加新端口映射的步骤及`wsl$`目录的作用

在Docker容器已经创建后&#xff0c;需要添加新的端口映射&#xff0c;即对已经存在的Docker容器添加新的端口映射&#xff0c;可以通过以下步骤来添加&#xff0c;即通过修改配置文件的方法。 如何新增端口映射&#xff1f; 查找容器的hash值 docker inspect [容器id或名称…

机器学习在智能音箱中的应用探索与实践:让声音更懂你

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

椋鸟数据结构笔记#5:树、二叉树基础

文章目录 树树的相关概念树的表示 二叉树基础二叉树分类满二叉树完全二叉树 二叉树的性质二叉树的存储结构顺序存储链式存储 萌新的学习笔记&#xff0c;写错了恳请斧正。 树 树是一种非线性的数据结构&#xff0c;它是由 n 个节点组成的一个具有层次关系的数据集合。其大概结…

算法学习——LeetCode力扣补充篇3(143. 重排链表、141. 环形链表、205. 同构字符串、1002. 查找共用字符、925. 长按键入)

算法学习——LeetCode力扣补充篇3 143. 重排链表 143. 重排链表 - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为&#xff1a; L0 → Ln → …

题目:小蓝的神秘行囊(蓝桥OJ 3937)

问题描述&#xff1a; 解题思路&#xff1a; 二维优化01背包模板题。与一维优化01背包不同在于多增加一维。 代码&#xff1a; #include <bits/stdc.h> using namespace std;const int N 1e2 9; int dp[N][N]; //二维的01背包&#xff0c;dp[i][j]&#xff1a;i是体…