p33 指针详解(1)(2)(3)

news2025/1/13 3:18:43

指针的进阶

1.字符指针

void test(int arr[])
{
    int sz=sizeof(arr)/sizeof(arr[0]);
    printf("%d\n", sz);
}
int main()
{
    int arr[10] = {0};
    test(arr);

    return 0;
}

这个代码在64位计算机中是8/4=2

在32位计算机中的是4/4=1

int main()
{
	char ch='w';
	char *pc=&ch;
	printf("%c\n",*pc);

	return 0;
}

代码输出w

 int main()
{
    char arr[]="abcdef";
    char *pc=arr;
    printf("%s\n",arr);
    printf("%s\n",pc);
}

打印的都是abcdef

int main()
{
    char *p = "abcdef";
    printf("%s\n", p);
}

下面这个例子说明,*p字符串是不能够修改的。加上const就行了。

int main()
{
    const char *p="abcedf";
    //*p='W';
    printf("%s",p);
    return 0;
}

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcdef";
	char * p1 = "abcdef";
	char * p2 = "abcdef";
	if (arr1 == arr2)
	{

		printf("hehe\n");
	}
	else
	{
		printf("haha\n");
	}
	

	return 0;
}

haha

因为地址不相同

int main()
{
    char arr1[] = "abcdef";
    char arr2[] = "abcdef";
    char * p1 = "abcdef";
    char * p2 = "abcdef";
    if (p1==p2)
    {

        printf("hehe\n");
    }
    else
    {
        printf("haha\n");
    }
    

    return 0;
}

我条件改变了,p1==p2

直接就是hehe

因为字符串相同了 

2.数组指针

//数组指针-指针

int  main()

{

int *p=NULL;//p是整型指针-指向整形的指针-可以存放整型的地址

char *pc=NULL;//pc是字符的指针-指向字符的指针-可以存放字符的地址

//数组的指针-指向数组的指针  -存放数组的地址

//int arr[10]={0};

//arr-首元素地址

//&arr-数组的地址

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

int(*p)[10]=&arr;//数组的地址存起来

//上面的p就是数组指针

return 0;

}

int main()
{
    char *arr[5];
    char *(*pa)[5]=&arr;//【5】pa指向的数组是5个元素

//pa指向的数组的元素类型是char *
int arr2[10]={0};

int (*pa2)[10]=&arr2;

return 0;
}

int main()
{
	int arr[10]={1,2,3,4,5,6,7,8,9,10};
	int (*pa)[10]=&arr;
	int i=0;
	for(i=0;i<10;i++){
		printf("%d ",(*pa)[i]);
	}
	return 0;
}

int main()
{
	int arr[10]={1,2,3,4,5,6,7,8,9,10};
	int (*pa)[10]=&arr;
	int i=0;
	for(i=0;i<10;i++){
		printf("%d ",*(*pa+i));//*pa=arr
	}
	return 0;
}
int main()
{
	int arr[10]={1,2,3,4,5,6,7,8,9,10};
	int *p=arr;
	int i=0;
	for(i=0;i<10;i++){
		printf("%d ",*(p+i));
	}
}
void print1(int arr[3][5],int x,int y)
{
	int i=0;
	int j=0;
	for(i=0;i<x;i++)
	{
		for(j=0;j<y;j++)
		{
			printf("%d",arr[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}};

	print1(arr,3,5);//arr -数组名 -数组名就是首元素地址
}

//参数是数组的形式
void print1(int arr[3][5],int x,int y)
{
	int i=0;
	int j=0;
	for(i=0;i<x;i++)
	{
		for(j=0;j<y;j++)
		{
			printf("%d ",arr[i][j]);
		}
		printf("\n");
	}
}
//参数是指针的形式
void print2(int (*p)[5],int x,int y)
{
	int i=0;
	for(i=0;i<x;i++)
	{
		int j=0;
		for(j=0;j<y;j++)
		{
			//printf(	"%d ",*(*(p+i)+j));
              //printf("%d ",(*(p+i))[j]);
            //printf("%d",*(p[i]+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}};

	print1(arr,3,5);
	print2(arr,3,5);
	return 0;
}

int arr[5]; //arr是一个5个元素的整形数组

int *parr1[10];//parr1 是一个数组,数组有10个元素,每个元素的类型是int *,parr1是指针数组

int (*parr2)[10];//parr2是一个指针,该指针指向一个数组,数组有10个元素,每个元素的类型是int   parr2是数组指针

int (*parr3[10])[5];//parr3是一个数组,该数组有10个元素,每个元素是一个数组指针。

该数组指针指向的数组有5个元素。每个元素是int

前倾回顾:

int main()
{
    //字符指针
    char ch='w';
    char *p=&ch;
    const char *p2="abcdef";
    //指针数组-数组-存放指针的数组
    int *arr[10];
    char *ch[5];
    //数组指针
    //int *p3;//整型指针-指向整型的指针
    //char *p4;//字符指针-指向字符的
    int arr[5];//数组
    int (*pa)[5]=&arr2;//取出数组的地址,pa就是一个数组指针


    
    return 0;
}


 

3.指针数组

 //指针数组 是数组,用来存放指针的


int main(){
    int arr[10]={0};
    char ch[5]={0};
    int *parr[4];//存放整型指针的数组-指针数组
    char * pch[5];//存放字符指针的数组-指针数组

}

int main()
{
	int a = 10;
	int b=20;
	int c = 30;
	int d = 40;
	int *arr[4] = { &a,&b,&c,&d };
	int i = 0;
	for (i = 0; i < 4; i++)
	{
		printf("%d\n", *arr[i]);
	}	
	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 *parr[] = { arr1,arr2,arr3 };
	for (int i = 0; i < 3; i++)//3列
	{
		for (int j = 0; j < 5; j++)//5行
		{
			printf("%d ", parr[i][j]);//输出
		}
		}
		printf("\n");
	}
}

4.数组传参和指针传参

void test(int arr[])
{}
void test(int arr[10])
{}
void test(int *arr)
{}
void test2(int *arr[20])//ok
{}
void test2(int **arr)//ok
{}
int main()
{
    int arr[10]={0};
    int *arr2[20]={0};
    test(arr);
    test2(arr2);
}

void test(int arr[3][5])
{}
void test1(int arr[][5])
{}
//void test2(int arr[3][])//err
//{}
int main()
{
    int arr[3][5] = { 0 };
    test(arr);//二维数组传参
    test1(arr);
    //test2(arr);
}
 

//void test(int arr[3][5])
//{}
//void test1(int arr[][5])
//{}
void test2(int arr[3][])//err
{}
void test3(int *arr)//err
{}
void test4(int **arr)//err
{}
void test5(int (*arr)[5])
{}

int main()
{

    int arr[3][5] = { 0 };
    //test(arr);//二维数组传参
    //test1(arr);
    //test2(arr);
    //test3(arr);
    //test4(arr);
    test5(arr);
}

一级指针传参

void print(int *p,int sz) {
    for (int i = 0; i < sz; i++) {
        printf("%d ", *(p + i));
    }

}
int main() {
    int arr[] = { 1,2,3,4,5,6,7,8,9};
    int* p = arr;
    int sz=sizeof(arr)/sizeof(arr[0]);
    //一级指针p,传给函数
    print(p,sz);
    
    return 0;
}

当一个函数的参数部分为一级指针的时候,函数能接受什么参数?

void test1(int* p)
{}
void test2(char *p)
{}
int main()
{
    int a = 10;
    int *p1=&a;
    test1(&a);//ok
    test1(p1);//ok
    char ch='w';
    char *pc=&ch;
    test2(&ch);
    test2(pc);//ok
    return 0;
}

二级指针传参

void test(int** ptr)
{
    printf("%d\n", **ptr);
}
int main()
{
    int a = 10;
    int* p = &a;
    int** pp = &p;
    test(pp);
    test(&p);
    return 0;
}

void test(int **p)
{}
int main()
{
    int* ptr;
    int** pp = &ptr;
    test(pp);
    int* arr[10];
    test(arr);//指针数组
    return 0;
}

5.函数指针

//数组指针-是指向数组的指针

//函数指针-是指向函数的指针-存放函数地址的一个指针

int Add(int x, int y) {
    return x + y;
}
int main() {
    int a = 0;
    int b = 0;
    scanf("%d%d", &a, &b);
    int sum = Add(a, b);
    printf("%d\n", sum);
    return 0;
}

int Add(int x, int y) {
	return x + y;
}
int main() {
	int a = 10;
	int b = 20;
	int arr[10] = {0};
	//&arr;
	//arr;
	//printf("%d\n", Add(a,b));
        //&函数名和函数名都是函数的地址

	printf("%p\n", &Add);
	printf("%p\n", Add);
	return 0;
}

int Add(int x, int y) {
    return x + y;
}
int main() {
    /*int a = 10;
    int b = 20;
    int arr[10] = { 0 };
    int (*p)[10] = &arr;*/
    //&arr;
    //arr;
    //printf("%d\n", Add(a,b));

    //printf("%p\n", &Add);
    //printf("%p\n", Add);
    int (*pa)(int,int) = Add;
    printf("%d\n",(*pa)(2, 3));//5
    return 0;
}

结果是5

 

6.函数指针数组

7.指向函数指针数组的指针

8.回调函数

9.指针和数组面试题的解析

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

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

相关文章

vue2 搭配 html2canvas 截图并设置截图时样式(不影响页面) 以及 base64转file文件上传 或者下载截图 小记

下载 npm install html2canvas --save引入 import html2canvas from "html2canvas"; //使用 html2canvasForChars() { // 使用that来存储当前Vue组件的上下文&#xff0c;以便在回调函数中使用 let that this; // 获取DOM中id为"charts"的元素&…

3.1 拓扑排序

有向图的存储 邻接矩阵 邻接表 拓扑排序 有向无环图&#xff1a;不存在环的有向图 环&#xff1a; 在有向图中&#xff0c;从一个节点出发&#xff0c;最终回到它自身的路径被称为环 入度&#xff1a; 以节点x为终点的有向边的条数被称为x的入度 出度&#xff1a; 以节…

汽车配件销售系统2024

下载在最后,编号ssm007 技术栈: ssmmysqljsp 展示: 下载地址: CSDN现在上传有问题,有兴趣的朋友先收藏.正常了贴上下载地址 备注: 运行有问题请私信我,私信按钮在文章左边) 另外接各种定制系统,java,spring,c,c,python

upload-labs靶场(超详解)1-16关

pass1 从代码中可以看出&#xff0c;是通过js进行文件格式检查 <script type"text/javascript">function checkFile() {var file document.getElementsByName(upload_file)[0].value;if (file null || file "") {alert("请选择要上传的文件…

Nmap/DNS信息收集实验

​实验背景 在安全服务项目中&#xff0c;需要对网络结构进行分析评估&#xff0c;其中风险评估第一步就是信息收集&#xff0c;主要包括活跃主机发现、开放端口号、系统指纹信息等。 实验设备 一个网络 net:cloud0 一台模拟黑客 kali 主机 一台靶机 windows 主机 实验…

go 语言中 init() 函数是什么时候执行的?

文章目录 一、init() 函数什么时候执行&#xff1f;二、init() 函数特点三、代码执行顺序四、多个 init() 函数执行顺序1、一个源文件中多个 init() 函数2、一个包中多个 init() 函数3、多个包中多个 init() 函数&#xff08;不存在依赖&#xff09;4、多个包中多个 init() 函数…

MySQL--数据类型

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 在MySQL数据库管理系统中&#xff0c;可以通过存储引擎来决定表的类型。同时&#xff0c;MySQL数据库管理系统也提供了数据类型决定表存储数据的类型 …

记录导致计算轮廓面积出错的一个坑点

1.前言 计算轮廓面积是常见的几何算法话题&#xff0c;获取轮廓面积、计算轮廓法线等场景会涉及到。计算轮廓面积的方法有很多&#xff0c;一种常用的是微积分思路的分段求和办法&#xff0c;即组成轮廓的每条线段与X轴或Y轴进行有向投影&#xff0c;轮廓边线与X轴或Y轴的投影之…

【SQL Server】SQL Server基础知识概览

目录 第1章&#xff1a;SQL Server 概览 SQL Server 版本介绍 SQL Server 架构 SQL Server 组件 第1章&#xff1a;SQL Server 概览 SQL Server 版本介绍 SQL Server 是 Microsoft 开发的一款关系型数据库管理系统 (RDBMS)&#xff0c;广泛应用于企业级数据存储和处理场景…

Mysql学习-day15

Mysql学习-day15 1. 行列转换 在MySQL中&#xff0c;行列转换可以通过使用CASE语句结合聚合函数来实现。 表t_score数据如图所示 我们想要以学科为列名&#xff0c;展示每个学生的科目成绩&#xff0c;可以先用CASE语句来选出每科的成绩&#xff0c;再进行求和。 选择科目时…

【C++】模拟实现list

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目及其功能 &#x1f4cc;了解list官方标准 了解模拟实现list &#x1f4cc;了解更底层的list实现 二.list迭代器和vector迭代器的异同 &#x1f4cc;迭代…

SSH实现电脑VScode免密登录到虚拟机其原理

在网上想看一下这个原理。发现写的还是比较乱&#xff0c;所以自己总结了一份方便回顾 SSH免密登录的原理主要基于非对称密钥加密技术&#xff0c;比较常用的是RSA算法。 以下是SSH免密登录的详细步骤和原理&#xff1a; 1. 生成密钥对 在客户端上生成一对密钥&#xff0c;…

系统复习Java日志体系

一&#xff0c;我们采用硬编码体验一下几个使用比较多的日志 分别导入几种日志的 jar 包 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSch…

【已解决】YOLOv8加载模型报错:super().__init__(torch._C.PyTorchFileReader(name_or_buffer))

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

C#——Json数据存储

本文使用的软件为VS2022&#xff0c;不同的软件使用上有些许差异。 C#数据存储 关于数据存储&#xff0c;一般在退出控制台之后&#xff0c;暂存的数据都会释放掉&#xff0c;有没有什么方法能够在下一次进入的时候还能加载上一次的数据呢&#xff1f;答案是有的&#xff0c;关…

利用Arcgis设置分式标注(分子分母标注)

因工作需要&#xff0c;需要设置分式标注&#xff0c;下面详细介绍下如何利用arcgis 设置分式标注&#xff0c;以下操作以供参考&#xff0c;如有疑义可提出。 一、准备工作 软件&#xff1a;arcmap 示例数据&#xff1a;行政区shp矢量图 二、操作步骤 1.添加数据 将行政区sh…

Golang | Leetcode Golang题解之第307题区域和检索-数组可修改

题目&#xff1a; 题解&#xff1a; type NumArray struct {nums, tree []int }func Constructor(nums []int) NumArray {tree : make([]int, len(nums)1)na : NumArray{nums, tree}for i, num : range nums {na.add(i1, num)}return na }func (na *NumArray) add(index, val …

MinIO安装(思路、方法、步骤(以centos8安装为例))

MinIO安装&#xff08;思路、方法、步骤&#xff08;以centos8安装为例&#xff09;&#xff09; 简介 MinIO 是一个高性能、开源的对象存储系统&#xff0c;旨在提供简单、可扩展的存储解决方案&#xff0c;特别适用于大数据、AI 和 ML 应用。 步骤记录 首先我们进入官网看…

前端使用 Konva 实现可视化设计器(19)- 连接线 - 直线、折线

本章响应小伙伴的反馈&#xff0c;除了算法自动画连接线&#xff08;仍需优化完善&#xff09;&#xff0c;实现了可以手动绘制直线、折线连接线功能。 请大家动动小手&#xff0c;给我一个免费的 Star 吧~ 大家如果发现了 Bug&#xff0c;欢迎来提 Issue 哟~ github源码 gitee…

最全个人笔记【Makefile】

1. 基本概念 1.1 make是什么 当一个项目中要编译的文件很多时&#xff0c;手工使用编译器一个个进行编译&#xff0c;很明显不具有可操作性&#xff0c;此时必须借助某些软件&#xff0c;协助我们有序地、正确地自动编译整个工程的所有该编译的文件。这样的软件被称为 工程管…