C数组,指针

本文通过实例对比分析了C语言中不同方式声明的字符串及其对应的指针特性,包括数组名作为指针的特性、指针变量及指针数组的概念。
以前学C++的时候,对字符串和指针学的很模糊,现在有时间重新看C,开始还是很模糊,慢慢研究,渐渐有了头绪,决定写下来加深自己的印象。

首先,让我们来看 char shuzu[7];声明的字符串,直接上代码

#include<stdio.h>

int main()

char shuzu[7]="123456";

printf("%x\n",&shuzu);

printf("%x\n",shuzu);
printf("%x\n",&shuzu[0]);

return 0;

}

输出如图:

可以看到,输出的三个地址都相同。char shuzu[7]="123456"语句执行的时候,系统就分配了一段长7字节的连续内存,并把这段内存起名为shuzu,里面的值为"123456"

&shuzu,就是shuzu这个变量的内存地址,由于这段内存叫shuzu,所以shuzu的地址也就是这段内存的首地址,也就是'1'字符所在字节的地址;

shuzu,对于数组变量,可以使用变量名来索引变量中的内容,其实这里的shuzu可以理解成数组变量退化的指针,并且指向数组的开头,既然把它理解成指针,那么它的值肯定是地址了,所以他的值和上面的一样。(摘自互联网)

&shuzu[0],比较容易理解,第一个字符串的地址,因此和上面两个是一样的。

 

下面再来看以方法char *shuzu="123456";声明的字符串

#include<stdio.h>

int main()

char *shuzu="123456";

printf("%x\n",&shuzu);

printf("%x\n",shuzu);
printf("%x\n",&shuzu[0]);

return 0;

}

输出如图

可以看出 ,第一个和后两个输出有点区别,我们一个一个分析

首先,char *shuzu 是声明一个char类型的指针变量,和数组名称不同,它在内存中有自己的地址

&shuzu :就是取存储指针变量的值,也就是shuzu这个变量在内存中存储的地址

shuzu:存储在指针变量中的值,指向"123456"这个数组的首地址("123456"返回值是一个char类型的指针)。

&shuzu[0]:数组中第一个字符的地址,和数组相同。

 

这里要弄清数组名称和真正指针的区别。

最后来看最让我头疼的 指针数组 

用该表达式声明一个指针数组char *shuzu[]={"1","2"};

代码如下

#include<stdio.h>

int main()



char *shuzu[]={"1","2"};
printf("%x\n",&shuzu);
   printf("%x\n",shuzu);
   printf("%x\n",&shuzu[0]);
return 0;

}

输出如图

其实也很好理解,我们把指针数组看成是普通的数组,数组名称是shuzu,第一个值是shuzu[0],于是,这个数组和char shuzu[7]="123456"声明的数组大概相似了。只是一个数组里存储的char类型的指针,而另一个存储的是char类型的值,这样shuzu、&shuzu、和&shuzu[0]三个输出相同,我们也就明白了。

另外,*shuzu 的值是第一个字符串的地址。和shuzu不同。。

(Mathcad+Simulink仿真)基于扩展描述函数法的LLC谐振变换器小信号分析设计内容概要:本文围绕“基于扩展描述函数法的LLC谐振变换器小信号分析设计”展开,结合Mathcad与Simulink仿真工具,系统研究LLC谐振变换器的小信号建模方法。重点利用扩展描述函数法(Extended Describing Function Method, EDF)对LLC变换器在非线性工作条件下的动态特性进行线性化近似,建立适用于频域分析的小信号模型,并通过Simulink仿真验证模型准确性。文中详细阐述了建模理论推导过程,包括谐振腔参数计算、开关网络等效处理、工作模态分析及频响特性提取,最后通过仿真对比验证了该方法在稳定性分析与控制器设计中的有效性。; 适合人群:具备电力电子、自动控制理论基础,熟悉Matlab/Simulink和Mathcad工具,从事开关电源、DC-DC变换器或新能源变换系统研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握LLC谐振变换器的小信号建模难点与解决方案;②学习扩展描述函数法在非线性系统线性化中的应用;③实现高频LLC变换器的环路补偿与稳定性设计;④结合Mathcad进行公式推导与参数计算,利用Simulink完成动态仿真验证。; 阅读建议:建议读者结合Mathcad中的数学推导与Simulink仿真模型同步学习,重点关注EDF法的假设条件与适用范围,动手复现建模步骤和频域分析过程,以深入理解LLC变换器的小信号行为及其在实际控制系统设计中的应用。
### C语言中数组指针指针数组的区别及用法 #### 定义与基本概念 在C语言中,**数组指针**和**指针数组**是两种不同的数据结构。 - **数组指针**是一个指针变量,指向一个完整的数组对象。它的声明形式通常是 `type (*pointer_name)[size]`[^5]。 - **指针数组**是一个数组,其每个元素都是指针类型。它的声明形式通常是 `type *array_name[size]`。 --- #### 数组指针的特点及其使用方法 数组指针的主要特点是它可以用来访问整个数组或作为函数参数传递数组。以下是具体说明: 1. **声明数组指针** 数组指针可以通过以下方式声明: ```c int array[5]; int (*ptr)[5] = &array; ``` 这里,`(*ptr)` 是一个指针,指向具有 5 个整数的数组[^2]。 2. **访问数组元素** 使用数组指针访问数组中的元素时,可以直接解引用并加上偏移量: ```c printf("%d\n", (*ptr)[0]); // 访问第一个元素 printf("%d\n", (*ptr)[1]); // 访问第二个元素 ``` 3. **应用场景** - 动态内存分配时,可以利用数组指针管理多维数组。 - 函数间传递固定大小的数组时,数组指针能更高效地表达意图[^4]。 --- #### 指针数组的特点及其使用方法 指针数组的核心特点在于它是存储多个指针的一个连续区域。下面详细介绍如何声明和使用指针数组: 1. **声明指针数组** 指针数组可以通过如下方式进行声明: ```c char *strings[3] = {"hello", "world", "example"}; ``` 上述代码创建了一个包含三个字符串常量地址的指针数组[^3]。 2. **初始化与赋值** 可以为指针数组的各个元素分别赋予不同地址: ```c int a = 1, b = 2, c = 3; int *pointers[3] = {&a, &b, &c}; ``` 3. **遍历指针数组** 遍历指针数组的方式类似于普通数组: ```c for (int i = 0; i < 3; ++i) { printf("%s\n", strings[i]); } ``` --- #### 关键区别总结 | 特性 | 数组指针 | 指针数组 | |--------------------|-----------------------------------|------------------------------| | 类型 | 指向数组指针 | 存储指针数组 | | 声明 | `type (*pointer_name)[size]` | `type *array_name[size]` | | 数据布局 | 单一指针 | 多个独立指针 | | 是否可变 | 不可改变所指向的数组 | 各元素指针可单独修改 | --- #### 示例代码对比 ##### 数组指针示例 ```c #include <stdio.h> int main() { int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}; int (*p)[4] = arr; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 4; ++j) { printf("%d ", p[i][j]); } printf("\n"); } return 0; } ``` ##### 指针数组示例 ```c #include <stdio.h> #include <string.h> int main() { const char *str_arr[3] = {"Hello", "World", "Example"}; for (int i = 0; i < 3; ++i) { printf("%s\n", str_arr[i]); } return 0; } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值