大明湖畔的夏雨荷是什么意思| 为什么总长火疖子| 如如不动是什么意思| 小心地什么| 农历7月28日是什么星座| 跳蛋是什么| 虱子用什么药可以根除| 焱加木念什么| 心理素质差是什么原因| 疱疹用什么药可以根治| 女人吃什么越来越年轻| 尚清是什么意思| 玛丽苏什么意思| 五味指的是什么| 糟卤对身体有什么危害| 黄色裤子配什么上衣| 玻璃的原材料是什么| 拍身份证照片穿什么衣服| 柔五行属什么| 情商是什么意思| 突然全身抽搐是什么病| 炖乌鸡汤放什么配料| 拉尿分叉是什么原因| 血糖高适合吃什么水果| 米线和米粉有什么区别| 为什么一吹空调就鼻塞| 生源地是什么意思| 屁眼疼痛什么原因| 心神不定是什么生肖| 西游记什么时候拍的| 唇亡齿寒什么意思| 梦见换房子是什么预兆| 真言是什么意思| 血肿不治疗有什么后果| 痞子是什么意思| 贝字旁与什么有关| 屋后有坟有什么影响吗| sample是什么意思| 中午十一点是什么时辰| 眼睛流眼泪用什么眼药水| 小孩夜里哭闹是什么原因| 抗链球菌溶血素o偏高是什么原因| 把脉把的是什么脉| 常吃黑芝麻有什么好处和坏处| 口腔溃疡缺什么维生素| 豫州是现在的什么地方| 欲言又止下一句是什么| hscrp高是什么感染| 楷字五行属什么| 舌苔白色是什么原因| 改户口需要什么手续| 10月15日是什么星座| 气短吃什么药立马见效| 沙棘有什么功效| 西安古时候叫什么| 2019什么年| 梦见种菜是什么意思| 年轻人血压高是什么原因引起的| 5个月宝宝可以吃什么水果| 党内的最高处分是什么| 拍手腕中间有什么好处| 脾肺气虚吃什么中成药| 压疮是什么| 普外科是看什么病的| 紧张性头痛吃什么药| 手机充电口叫什么| 拉肚子不能吃什么| 兰芝属于什么档次| 宫颈ecc是什么意思| 阿玛尼手表属于什么档次| 白牌车是什么身份| 刀口力念什么| 生酮是什么意思| 怀孕初期怕冷是什么原因| 什么是信仰| 摩羯座跟什么星座最配| 34岁属什么的生肖| 化疗吃什么补白细胞| 荆芥是什么菜| 什么东西补肾最好| 脉跳的快是什么原因| 真太阳时是什么意思| 小拇指旁边的手指叫什么| 婴儿42天检查什么项目| 渗透压是什么| 心路历程是什么意思| 山麻雀吃什么| 小乌龟吃什么东西| 什么的夜晚| geforce是什么牌子| 线索细胞阳性什么意思| 史密斯夫妇什么意思| 金鱼吃什么食物| 复位是什么意思| 半边脸发麻是什么原因| 什么是气短| 嘉靖为什么不杀严嵩| piv是什么病毒| 腋窝淋巴结肿大挂什么科| 夏天容易出汗是什么原因| 口水臭什么原因| 小孩子手脚脱皮是什么原因| 中国第一艘航空母舰叫什么| 乳腺1类是什么意思| 七月三十是什么星座| 浪蹄子什么意思| 左耳朵嗡嗡响是什么原因引起的| 重症医学科是干什么的| 感冒为什么会咳嗽| 农历八月初一是什么星座| 德字五行属什么| 10月10号是什么星座| 吃什么补气补血最见效| 喘是什么意思| 肠胃功能紊乱什么症状| 92年是什么年| 月经量少要吃什么调理| 白天不懂夜的黑什么意思| 朝鲜和韩国什么时候分开的| 突然抽搐失去意识是什么原因| 蚊子不喜欢什么血型| 橙子皮泡水喝有什么好处| 前列腺钙化是什么原因引起的| 金针菇不能和什么一起吃| 腋下有异味是什么原因| 四季春茶属于什么茶| 澈是什么意思| 7号来的月经什么时候是排卵期| 项羽为什么不杀项伯| 芒硝是什么东西| 打夜针是什么意思| 宁的五行属性是什么| 肠胃炎可以喝什么饮料| 共轭什么意思| 吹弹可破的意思是什么| 军训是什么时候开始的| 膝盖肿胀是什么原因| 精索是什么| 办理暂住证需要什么材料| 儿童嗓子疼吃什么药好| 发烧白细胞高是什么原因| 高净值什么意思| 宫颈糜烂有什么症状| 清热解毒是什么意思| 分泌物多是什么原因| 什么什么三什么成语| 什么动物| 小便赤黄是什么原因| 常吃洋葱有什么好处| 狗狗湿疹用什么药膏最有效| 阻断是什么意思| 2007属什么生肖| 舌头起泡吃什么药好| 身上长疮是什么原因引起的| 做梦梦见蛇是什么征兆| 生酮饮食是什么| 10月24是什么星座| 一例是什么意思| 皮下出血小红点是什么原因造成的| 卟是什么意思| lv中文名叫什么| 什么是石女| 行号是什么| 手串13颗代表什么意思| 旭五行属什么| 一眼万年什么意思| 胆固醇高吃什么最好| 肾积水吃什么药| 碳酸钠俗称什么| 入木三分是什么意思| 腹痛挂什么科| 市组织部长是什么级别| 雅号是什么意思| 金鱼吃什么| qm医学上什么意思| 彼岸花什么时候开花| 摸头是什么意思| 配子是什么| 肺部肿瘤切除后吃什么| 急性阴道炎是什么引起的| 梦见麒麟是什么兆头| 胎菊和金银花一起泡水有什么效果| 10月3号是什么星座| 画代表什么生肖| 卡马西平片治什么病| 不经历风雨怎能见彩虹是什么意思| mr是什么检查| 一月30号是什么星座| 糟卤对身体有什么危害| 月经期适合吃什么水果| 教师节送什么礼物给老师| 蜂窝组织炎是什么病| 奴仆宫是什么意思| 冬至下雨有什么说法| 诈尸是什么意思| 排卵期身体有什么症状表现吗| 闻思修是什么意思| 老是掉发是什么原因| 大腿外侧麻木是什么原因| 石千读什么| 金银花有什么功效和作用| 鸽子不能和什么一起吃| 子宫肌瘤吃什么药| 肺部检查应该挂什么科| 农历8月13日是什么星座| 脑供血不足什么原因| 婚检男性检查什么| 什么叫做t| 大黄是什么药| 脑血管堵塞是什么症状| 2000年什么年| 卵巢多囊是什么原因造成的| 爱被蚊子咬是什么体质| 脱水有什么症状| 小孩脸肿是什么原因引起的| 警告处分有什么影响| 汉尼拔是什么意思| 来月经喝酒有什么影响| 重度肠化是什么意思| 卫冕冠军是什么意思| 宗人府是什么地方| 羊水是什么颜色的| 西红柿什么时候成熟| d2聚体高是什么原因| 打眼是什么意思| 干贝是什么东西做的| 什么炒肉好吃| 炼奶是什么| 喜鹊吃什么食物| 人为什么会觉得累| 周围神经病是什么意思| 实时播报什么意思| 15度穿什么| 丁火是什么意思| 脉数是什么意思| 闰月给父母买什么| 吃坏东西肚子疼吃什么药| 7月5号是什么星座| 血脂高吃什么食物最好| 用什么锅炒菜对人体健康更有益| 白果治什么病| 后壁是什么意思| 以貌取人是什么意思| 什么地说话| 足是什么结构| 低血糖不能吃什么食物| 翔是什么意思| 慢性浅表性胃炎吃什么药好| 下面干涩是什么原因导致的| 阴虚有什么症状| 膀胱炎吃什么药| 怀孕了不想要最好的办法是什么| 丹参滴丸和丹参片有什么区别| 眼睛吹风就流泪是什么原因| 生理期为什么会腰疼| 氯化钾主治什么病| 1981年五行属什么| 牛奶能做什么美食| 增强免疫力吃什么维生素| 胰腺炎吃什么药见效快| 眼睛干涩用什么药水| 霍金是什么病| 每天喝奶茶有什么危害| 给女生送礼物送什么好| 百度
打印
[学习资料]

浙江首个惩治“老赖”平台上线 含曝光、查询等10大功能

[复制链接]
1634|55
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
maudlu|  楼主 | 2025-3-20 21:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

一、深入理解数组:

1、什么是数组?

这个简单来理解的话,类似我们高中学的集合,只不过我们数组里装的是同类型的数据元素,而且数据元素之间的物理内存是连续的,而且一般也是有内存限制的,可以有重复的数据元素,是因为内存单元之间是独立的。

2、两方面来深入理解数组:

a):从内存角度来理解数组:

从内存角度讲,数组变量就是一次分配多个变量,而且这多个变量在内存中的存储单元是依次相连接的;我们分开定义多个变量(譬如int a, b, c, d;)和一次定义一个数组(int a[4]);这两种定义方法相同点是都定义了4个int型变量,而且这4个变量都是独立的单个使用的;不同点是单独定义时a、b、c、d在内存中的地址不一定相连,但是定义成数组后,数组中的4个元素地址肯定是依次相连的。数组中多个变量虽然必须单独访问,但是因为他们的地址彼此相连,因此很适合用指针来操作,因此数组和指针天生就叫纠结在一起。这里以int   a[4]为例,它里面有四个元素,也就有四个内存单元:

!

b):从**编译器**角度来理解数组:

          从编译器角度来讲,数组变量也是变量,和普通变量和指针变量并没有本质不同。变量的本质就是一个地址,这个地址在编译器中决定具体数值,具体数值和变量名绑定,变量类型决定这个地址的延续长度。注意地址是一个点:

!

3、数组中几个关键符号(a a[0] &a &a[0])的理解(前提是 int a[10]):

a):a就是数组名。a做左值时表示整个数组的所有空间(10×4=40字节),又因为C语言规定数组操作时要独立单个操作,不能整体操作数组,所以a不能做左值;a做右值表示数组首元素(数组的第1个元素,也就是a[0])的首地址(首地址就是起始地址,就是4个字节中最开始第一个字节的地址)。a做右值等同于&a[0]。

       b):a[0]表示数组的首元素,也就是数组的第1个元素。做左值时表示数组第1个元素对应的内存空间(连续4字节);做右值时表示数组第0个元素的值(也就是数组第0个元素对应的内存空间中存储的那个数)。

       c):&a就是数组名a取地址,字面意思来看就应该是数组的地址。&a不能做左值(&a实质是一个常量,不是变量因此不能赋值,所以自然不能做左值。);&a做右值时表示整个数组的首地址。

       d):&a[0]字面意思就是数组第1个元素的首地址(搞清楚[]和&的优先级,[]的优先级要高于&,所以a先和[]结合再取地址)。做左值时表示数组首元素对应的内存空间,做右值时表示数组首元素的值(也就是数组首元素对应的内存空间中存储的那个数值)。做右值时&a[0]等同于a。

代码语言:javascript

代码运行次数:0

运行

AI代码解释

#include <stdio.h>


int main(void)
{
int a, b, c, d;     // 分开独立定义4个int型变量
int a[4];           // 一次定义一个数组,包含4个int型变量

// 注意数组和指针在初始化时的式子,和平时赋值有不同。
int a[10] = {1, 3, 4, 0};       // 定义同时初始化
int *p = &a;                    // 定义同时初始化


a[0] = 4;
a[1] = 44;
a = {1, 4, 5, 32};  // 错误的,数组元素必须单个访问,不能整个数组来访问


}

------注意:为什么数组的地址是常量?因为数组是编译器在内存中自动分配的。当我们每次执行程序时,运行时都会帮我们分配一块内存给这个数组,只要完成了分配,这个数组的地址就定好了,本次程序运行直到终止都无法再改了。那么我们在程序中只能通过&a来获取这个分配的地址,却不能去用赋值运算符修改它。

4、小结:

(1):&a和a做右值时的区别:&a是整个数组的首地址,而a是数组首元素 的首地址。这两个在数字上是相等的,但是意义不相同。意义不相同会导致 他们在参与运算的时候有不同的表现。

  (2):a和&a[0]做右值时意义和数值完全相同,完全可以互相替代。

  (3):&a是常量,不能做左值。

  (4):a做左值代表整个数组所有空间,所以a不能做左值。

二、指针与数组的天生姻缘:

1、以指针方式来访问数组元素:

(1)数组元素使用时不能整体访问,只能单个访问。访问方式有2种:数组形式和指针形式。

(2)数组格式访问数组元素是:数组名[下标]; (注意下标从0开始)。

(3)指针格式访问数组元素是:*(指针+偏移量); 如果指针是数组首元素地址(a或者&a[0]),那么偏移量就是下标;指针也可以不是首元素地址而是其他哪个元素的地址,这时候偏移量就要考虑叠加了。

(4)数组下标方式和指针方式均可以访问数组元素,两者的实质其实是一样的。在编译器内部都是用指针方式来访问数组元素的,数组下标方式只是编译器提供给编程者一种壳(语法糖)而已。所以用指针方式来访问数组才是本质的做法。

2、从内存角度理解指针访问数组的实质:

(1)数组的特点就是:数组中各个元素的地址是依次相连的,而且数组还有一个很大的特点(其实也是数组的一个限制)就是数组中各个元素的类型比较相同。类型相同就决定了每个数组元素占几个字节是相同的(譬如int数组每个元素都占4字节,没有例外)。

(2)数组中的元素其实就是地址相连接、占地大小相同的一串内存空间。这两个特点就决定了只要知道数组中一个元素的地址,就可以很容易推算出其他元素的地址。

3、指针和数组类型的匹配问题:

(1)int *p; int a[5];p = a;// 类型匹配

(2)int *p; int a[5];p = &a;// 类型不匹配。p是int *, &a是整个数组的指针,也就是一个数组指针类型,不是int指针类型,所以不匹配

(3)&a、a、&a[0]从数值上来看是完全相等的,但是意义来看就不同了。从意义上来看,a和&a[0]是数组首元素首地址,而&a是整个数组的首地址;从类型来看,a和&a[0]是元素的指针,也就是int *类型;而&a是数组指针,是int (*)[5];类型。

代码语言:javascript

代码运行次数:0

运行

AI代码解释

#include <stdio.h>


int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int *p;
p = a;

printf("*(p+1) = %d.\n", *(p+1));
printf("*(p+1) = %d.\n", *((char *)p+1));
printf("*(p+1) = %d.\n", *(int *)((unsigned int)p+1));

char *p2;
p2 = (char *)p;
printf("*(p+1) = %d.\n", *(p2+1));


int a[5] = {1, 2, 3, 4, 5};
int *p;
p = &a;

printf("a = %x.\n", a);
printf("&a = %x.\n", &a);
printf("&a[0] = %x.\n", &a[0]);
printf("a[0] = %x.\n", a[0]);


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

printf("a[3] = %d.\n", a[3]);
printf("*(a+3) = %d.\n", *(a+3));
//  等效于:int b = *(a+3); printf("*(a+3) = %d.\n", b);

int *p;
p = a;      // a做右值表示数组首元素首地址,等同于&a[0]
printf("*(p+3) = %d.\n", *(p+3));       // 等同于a[3]
printf("*(p-1) = %d.\n", *(p-1));       // 等同于a[-1]

p = &a[2];
printf("*(p+1) = %d.\n", *(p+1));       // 等同于a[3]
printf("*(p-1) = %d.\n", *(p-1));       // 等同于a[1]
printf("*(p+3) = %d.\n", *(p+3));       // 等同于a[5]

return 0;
}
4、小结:

      (1)指针参与运算时,因为指针变量本身存储的数值是表示地址的,所以运算也是地址的运算。

       (2)指针参与运算的特点是,指针变量+1,并不是真的加1,而是加1\*sizeof(指针类型);如果是int \*指针,则+1就实际表示地址+4,如果是char \*指针,则+1就表示地址+1;如果是double \*指针,则+1就表示地址+8.

        (3)指针变量+1时实际不是加1而是加1×sizeof(指针类型),主要原因是希望指针+1后刚好指向下一个元素(而不希望错位)。

三、指针、数组与sizeof运算符

1、sizeof的错误纠正:

sizeof是C语言的一个运算符(主要sizeof不是函数,虽然用法很像函数),sizeof的作用是用来返回()里面的变量或者数据类型占用的内存字节数。

2、代码示例讲解:

代码语言:javascript

代码运行次数:0

运行

AI代码解释

#include <stdio.h>
  #include <string.h>


   #define dpChar char *
   typedef char * tpChar;        // typedef用来重命名类型,或者说用来制造用户自定义类型


  // func完全等同于func1
     void func(int a[])
     {
       printf("数组大小 = %d.\n", sizeof(a));
     }

     void func1(int *a)
     {
         printf("数组大小 = %d.\n", sizeof(a));
    }

     void func2(int *a, int num)
   {
   // 在子函数内,a是传进来的数组的指针(首地址)
   // 在子函数内,num是数组的大小
   }



  int main(void)
 {
      int a[56];
      int b = sizeof(a) / sizeof(a[0]); // 整个数组字节数/数组中一个元素的字节数
          printf("b = %d.\n", b);                // 结果应该是数组的元素个数


/*  
   dpChar p1,  p2;          // 展开:char *p1, p2; 相当于char *p1, char p2;
tpChar p3,  p4;         // 等价于:char *p3, char *p4;  
printf("sizeof(p1) = %d.\n", sizeof(p1));       // 4
printf("sizeof(p2) = %d.\n", sizeof(p2));       // 1
printf("sizeof(p3) = %d.\n", sizeof(p3));       // 4
printf("sizeof(p4) = %d.\n", sizeof(p4));       // 4
 */

 /*
int a[20];
func(a);            // 4 因为a在函数func内部就是指针,而不是数组

func1(a);

func2(a, sizeof(a));
  */

/*  
int b1[100] = {0};
printf("sizeof(b1) = %d.\n", sizeof(b1));    
 // 400 100×sizeof(int)

short b2[100] = {};
printf("sizeof(b2) = %d.\n", sizeof(b2));       // 200 100×sizeof(short)

double b3[100];
printf("sizeof(b3) = %d.\n", sizeof(b3));       // 800 100×sizeof(double)
*/  

/*
int n = 10;
printf("sizeof(n) = %d.\n", sizeof(n));         // 4
printf("sizeof(int) = %d.\n", sizeof(int));     // 4
  */

  /*
char str[] = "hello";  
char *p = str; 
printf("sizeof(p) = %d.\n", sizeof(p));         // 4 相当于sizeof(char *)
printf("sizeof(*p) = %d.\n", sizeof(*p));       // 1 相当于sizeof(char)
printf("strlen(p) = %d.\n", strlen(p));         // 5 相当于strlen(str)
 */

  /*
char str[] = "hello";  
printf("sizeof(str) = %d.\n", sizeof(str));             // 6
printf("sizeof(str[0]) = %d.\n", sizeof(str[0]));       // 1
printf("strlen(str) = %d.\n", strlen(str));             // 5
  */  

          return 0;
  }

说明:

(1):函数传参,形参是可以用数组的

    (2):函数形参是数组时,实际传递是不是整个数组,而是数组的首元素首地址。也就是说函数传参用数组来传,实际相当于传递的是指针(指针指向数组的首元素首地址)。

  (3):strlen是一个C库函数,用来返回一个字符串的长度(注意,字符串的长度是不计算字符串末尾的'\\0'的)。一定要注意strlen接收的参数必须是一个字符串(字符串的特征是以'\\0'结尾) 。
沙发
时光贩卖机| | 2025-3-21 10:44 | 只看该作者
指针参与运算时的特点很关键,+1操作实际上是加1*sizeof(指针类型),这个知识点在处理数组时特别有用
板凳
uptown| | 2025-4-4 10:59 | 只看该作者
数组名本质上是一个指向数组首元素的常量指针。
地板
chenci2013| | 2025-4-4 11:46 | 只看该作者
单片机的内存资源有限,需合理使用数组和指针
5
mollylawrence| | 2025-4-4 13:18 | 只看该作者
编译时确定地址偏移,无运行时计算开销。
6
mnynt121| | 2025-4-4 16:19 | 只看该作者
通过指针的加减运算,可以快速遍历数组元素
7
usysm| | 2025-4-5 20:34 | 只看该作者
单片机RAM有限,需谨慎使用动态分配。指针与数组的结合可减少数据拷贝,提升效率
8
hudi008| | 2025-4-8 10:10 | 只看该作者
在使用指针访问数组元素时,要注意指针越界问题,防止访问到数组之外的内存区域
9
mnynt121| | 2025-4-8 13:21 | 只看该作者
借助指针,可以像访问数组元素那样,通过指针的偏移来访问数组中的各个元素。
10
sesefadou| | 2025-4-8 16:22 | 只看该作者
数组名代表数组的首地址,即指向数组第一个元素的指针。
11
timfordlare| | 2025-4-9 19:11 | 只看该作者
指针是一个变量,用于存储内存地址。
通过指针可以访问和操作内存中的数据。
12
benjaminka| | 2025-4-10 01:33 | 只看该作者
通过指针高效遍历和操作数组。              
13
belindagraham| | 2025-4-10 13:30 | 只看该作者
可以定义指向数组的指针,这种指针可以用来指向整个数组,而不是数组中的单个元素。
14
zerorobert| | 2025-4-10 15:37 | 只看该作者
动态分配与释放资源,适应有限内存环境。
15
saservice| | 2025-4-10 17:45 | 只看该作者
在使用指针访问数组元素时, 指针不越界,避免访问非法内存地址。
16
yorkbarney| | 2025-4-10 19:49 | 只看该作者
在单片机编程中,可以使用指针进行动态内存分配 ,灵活地管理内存资源。
17
ingramward| | 2025-4-10 21:50 | 只看该作者
未正确限制索引范围可能导致内存覆盖。建议使用静态分析工具或调试器检查边界条件。
18
bestwell| | 2025-4-12 19:53 | 只看该作者
可以创建指针数组,其中每个元素都是指向某种类型的指针。这在处理字符串数组时特别有用。
19
janewood| | 2025-4-12 21:54 | 只看该作者
当数组作为参数传递给函数时,实际上传递的是指向数组第一个元素的指针。这意味着在函数内部,无法通过数组参数直接知道数组的长度。
20
bestwell| | 2025-4-13 10:31 | 只看该作者
指向数组的指针可以是常量,也可以是指向常量的指针,这影响了指针和指针所指向的值是否可以被修改。
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

1605

帖子

0

粉丝
湿疹是什么症状图片 查性激素六项挂什么科 nerf是什么意思 甲胎蛋白偏高说明什么 多晒太阳有什么好处
世界上最大的鱼是什么 出去旅游需要带什么 卫衣是什么 药学专业是干什么的 肺五行属什么
扶苏姓什么 前胸后背长痘痘用什么药 男人为什么喜欢吃奶 速战速决的意思是什么 羊蛋是什么部位
c反应蛋白什么意思 懒羊羊的什么 梦见打麻将是什么意思 房性逸搏心律是什么意思 除外是什么意思
慢性病都包括什么病hcv8jop0ns9r.cn 心肌缺血做什么检查能查出来jinxinzhichuang.com 吃姜对身体有什么好处cl108k.com 欧阳修字什么hcv8jop7ns1r.cn 麻风疫苗什么时候打kuyehao.com
卟是什么意思hcv9jop6ns8r.cn 什么叫矫正视力hcv8jop5ns4r.cn 清宫和人流有什么区别hcv8jop9ns3r.cn 无缘无故头疼是什么原因hcv9jop6ns5r.cn 乙肝病毒表面抗体弱阳性什么意思hcv9jop0ns9r.cn
憋尿憋不住是什么原因hcv8jop9ns3r.cn 青蛙为什么叫hcv9jop1ns0r.cn 家里进黄鼠狼是什么预兆hcv8jop7ns8r.cn doms是什么意思hcv8jop9ns9r.cn 金生水是什么意思hcv7jop4ns5r.cn
鲫鱼不能和什么一起吃hcv8jop3ns1r.cn 邓超什么星座的hcv9jop3ns7r.cn 胃反酸是什么原因造成的hcv8jop7ns3r.cn 关羽的武器叫什么hcv9jop5ns8r.cn 足是什么结构0297y7.com
百度