C语言的一些杂记6

news/2024/12/3 7:49:53/

实现矩阵序号转置的三种方式

    for (i = 0; i < row * col; ++i)t[i / row][i % row] = m[i % row][i / row];
    for (i = 0; i < row; ++i)for (j = 0; j < col; ++j)t[j][i] = m[i][j];
	 for (i = 0; i < row; ++i)for (j = 0; j < col; ++j)*(*(t + j) + i) = *(*(m + i) + j); 

变相数组

变量的值在编译期间并不能确定,只有等到程序运行后,根据计算结果才能知道它的值到底是什么,所以数组长度中一旦包含了变量,那么数组长度在编译期间就不能确定了,也就不能为数组分配内存了,只有等到程序运行后,得到了变量的值,确定了具体的长度,才能给数组分配内存,我们将这样的数组称为变长数组(VLA, Variable Length Array)。

普通数组(固定长度的数组)是在编译期间分配内存的,而变长数组是在运行期间分配内存的。

指针不懂得问题

#include <stdio.h>
#define ROW 3
#define COL 4int main(int argc, char** argv)
{int i, j;int mat[ROW][COL] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};for (i = 0; i < ROW; ++i){for (j = 0; j < COL; ++j)printf("%d\t", *(*mat + (i * COL + j)));//不明白这种遍历方式printf("\n");}return 0;
}
printf("%d\t", *(++p));
printf("%d\t", (p++)); // ()优先级高于解引用,所以p先++后再解引用,实际输出从第一行的第二个元素开始输出的。

输出的一些问题

怎么输出》 “my salary was increased by 30%!”

#include<stdio.h>int main(int argc, char** argv)
{printf(" \" my salary was increased by 30%% ! \"  ");
}//\" 为 "
//%% 为 %

数组指针与指针数组

一些非常重要的概念:
“数组指针”和“指针数组”,只要在名词中间加上“的”字,就知道中心了——

数组的指针:是一个指针,什么样的指针呢?指向数组的指针

指针的数组:是一个数组,什么样的数组呢?装着指针的数组

然后,需要明确一个优先级顺序:()>[]>*,所以:

(*p)[n]:根据优先级,先看括号内,则p是一个指针,这个指针指向一个一维数组,数组长度为n,这是“数组的指针”,即数组指针;

*p[n]:根据优先级,先看[],则p是一个数组,再结合,这个数组的元素是指针类型,共n个元素,这是“指针的数组”,即指针数组。

根据上面两个分析,可以看出,p是什么,则词组的中心词就是什么,即数组“指针”和指针“数组”。

int *p1[5]//指针的数组
int (*p2)[5]//数组的指针

首先,对于语句int* p1[5],因为“[]”的优先级要比 * 要高,所以 p1 先与“[]”结合,构成一个数组的定义,数组名为 p1,而“int*”修饰的是数组的内容,即数组的每个元素。也就是说,该数组包含 5 个指向 int 类型数据的指针,如图 1 所示,因此,它是一个指针数组。
在这里插入图片描述

其次,对于语句int (* p2)[5],“()”的优先级比“[]”高,“*”号和 p2 构成一个指针的定义,指针变量名为 p2,而 int 修饰的是数组的内容,即数组的每个元素。也就是说,p2 是一个指针,它指向一个包含 5 个 int 类型数据的数组,如图 2 所示。很显然,它是一个数组指针,数组在这里并没有名字,是个匿名数组。
在这里插入图片描述

由此可见,对指针数组来说,首先它是一个数组,数组的元素都是指针,也就是说该数组存储的是指针,数组占多少个字节由数组本身决定;而对数组指针来说,首先它是一个指针,它指向一个数组,也就是说它是指向数组的指针,在 32 位系统下永远占 4 字节,至于它指向的数组占多少字节,这个不能够确定,要看具体情况。

#include "stdafx.h"int main()
{//一维数组int a[5] = { 1, 2, 3, 4, 5 };//步长为5的数组指针,即数组里有5个元素int (*p)[5];//把数组a的地址赋给p,则p为数组a的地址,则*p表示数组a本身p = &a;//%p输出地址, %d输出十进制//\n回车//在C中,在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址,它的类型取决于数组元素的类型。printf("%p\n", a); //输出数组名,一般用数组的首元素地址来标识一个数组,则输出数组首元素地址printf("%p\n", p); //根据上面,p为数组a的地址,输出数组a的地址printf("%p\n", *p); //*p表示数组a本身,一般用数组的首元素地址来标识一个数组printf("%p\n", &a[0]); //a[0]的地址printf("%p\n", &a[1]); //a[1]的地址printf("%p\n", p[0]); //数组首元素的地址printf("%d\n", **p); //*p为数组a本身,即为数组a首元素地址,则*(*p)为值,当*p为数组首元素地址时,**p表示首元素的值1printf("%d\n", *p[0]); //根据优先级,p[0] 表示首元素地址,则*p[0]表示首元素本身,即首元素的值1printf("%d\n", *p[1]); //为一个绝对值很大的负数,不表示a[1]...表示什么我还不知道

在这里插入图片描述

”stdafx.h”的用途和用法

stdafx.h”的用途和用法


http://www.ppmy.cn/news/81462.html

相关文章

人类睡眠EEG分析:附代码实现的方法学入门

导读 近年来&#xff0c;人类睡眠脑电图(EEG)研究激增&#xff0c;采用了越来越复杂的分析策略将电生理活动与认知和疾病联系起来。然而&#xff0c;正确计算和解释当代睡眠EEG中使用的指标需要注意许多理论和实际的信号处理细节。本研究回顾了与频谱分析、蒙太奇选择、相位和…

【OpenCV DNN】Flask 视频监控目标检测教程 01

欢迎关注『OpenCV DNN Youcans』系列&#xff0c;持续更新中 【OpenCV DNN】Flask 视频监控目标检测教程 01 【OpenCV DNN】Flask 视频监控目标检测教程 01 1. 面向Python程序的Web框架2. Flask 框架的安装与使用2.1 Flask 安装2.2 Flask 框架例程2.3 绑定IP和端口2.4 Flask路…

三线制Pt100隔离器在掘进机电机保护系统中的应用

摘要&#xff1a;三线制Pt100隔离器相较于二线制的更加稳定可靠&#xff0c;在中低温地区有广泛的应用。掘进机电机保护系统中&#xff0c;利用三线制Pt100隔离器将热电阻信号转换为线性4-20mA电流信号&#xff0c;经过A/D转化&#xff0c;传输至PLC并显示&#xff0c;通过实时…

Aspose.Tasks for Java 23crack

Aspose.Tasks for Java 23crack 新属性允许您控制“分配成本”和“剩余成本”的自动计算。 Aspose.Tasks for Java是一个项目管理API&#xff0c;可帮助您操作Microsoft project文档。开发人员可以定义项目的主要属性和默认属性以及日历信息。他们还可以指定工作日和日历例外情…

还不懂 Spring Boot 启动流程的,看这一篇就够了!

通常&#xff0c;我们只需为一个类添加SpringBootApplication注解&#xff0c;然后再添加一个main方法&#xff0c;其内固定的写法为SpringApplication.run(Application.class, args)。由此&#xff0c;便可启动Spring Boot服务。 具体而言&#xff0c;Spring Boot的启动流程包…

【C++】运算符重载(日期类的实现)

【C】运算符重载&#xff08;日期类的实现&#xff09; 前言运算符重载operator全局和类中 日期类的实现成员变量的确定构造函数拷贝构造 运算符重载部分的重载思路实现GETmonthdayoperator 的重载思路实现 -的与-的重载实现 各个比较运算符的重载实现 前置与后置实现 &#xf…

《Java设计模式学习》迭代器模式

在这里&#xff0c;包括在很多的书中&#xff0c;我们都会看到设计模式的Demo都很简单。但是我们在实际开发过程中&#xff0c;却往往很少用到类似的设计模式。 但是大家在看到这篇文章的时候&#xff0c;希望大家可以动手敲一下。也许在敲击的过程中&#xff0c;你能获取到一定…

创建本地LocalHost-SSL证书

mkcert 使用方法 mkcert 是一个开源工具&#xff0c;用于快速生成有效的本地开发证书。它可以帮助开发人员在本地环境中使用 HTTPS 加密来模拟真实的生产环境。 安装 首先&#xff0c;你需要安装 mkcert 工具。以下是在常见操作系统上安装的命令&#xff1a; macOS 使用 Homebr…