首页
学习
活动
专区
工具
TVP
发布

彻底弄懂C语言数组名

数组名不是指针,但大多数使用到数组名地方,编译器都会把数组名隐式转换成一个指向数组首元素指针来处理。...(出自《C和指针》第141页) 这里需要补充两点,&a类型和二维数组名类型。...然后二维数组类型同样取决于数组元素类型,假设有二维数组int b[10][20] 因为C语言多维数组实际上是一维数组,二维数组实际上只是一个一维数组,只不过里面每个元素又是一个一维数组而已。...a 值是数组首元素地址,它并不是一个指针。 “取一个数组名地址所产生是一个指向数组指针,而不是一个指向某个指针常量值指针”(出自《C和指针》第142页)。...这在C++里称为尾后指针。

46120

C语言数组名取地址

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。 作者 : 卿笃军 你有没有想过,对一个一维数组名取地址,然后用这个地址进行加减运算。这会出现什么样结果呢?...答:a是一个一维数组名字,&a相当于一个指向一维数组指针。怎么感觉这么熟悉?指向数组指针,那不就是行指针吗?int (*p)[]。...答:上面不是说了嘛,&a就是一个行指针,那就是指向一行指针咯。...行指针+1,不就指向下一行了,这里一行为[5]个,那么int *p = (int *)(&a+1)就要在a基础上偏离5个位置:(例如以下:上一行表示偏离位数,下一行表示a[]中相应数据) 0 1...你输出是*(p-1),这里p是一个单指针-1就是往左位移一位即可了,那不就是又回到5位置了吗?原来是这样,输出结果是5 。

1.6K20
您找到你想要的搜索结果了吗?
是的
没有找到

C++数组名a和&a区别

下面说说a和&a区别,说完了,再看该题结果。 C/C++里面的数组名字会退化为指针,所以数组名a实际指的是数组第一个元素地址。...而数组名作为指针来讲有特殊性,它正在它所指向内存区域中,&a值和a数值是相同(可以输出观察一下),但是类型和意义不同。而指针加法操作和指向数据类型密切相关。...但是&a类型则相当于int **,是所谓指向数组指针,是数组元素类型二级指针,对它加1是相当于 &a + 1 * sizeof(a),所以会偏移一个数组长度。...现在来看程序,&a + 1其实偏移了一个数组长度即就是6,其实在VS中通过调试可以查看&a + 1类型,其类型为int[5] *,所以(int*)(&a + 1)将其强制转成int *类型。...这里应该很明显了a + 1指向是数组a第二个元素,p指向是数组后面的元素(这里我们不知道它是多少),p - 1则指向数组最后一个元素!  所以程序运行结果为3 6.

88350

C语言】函数详解

例如y=x+1,给x赋一个值,你将得到一个y值,y值随着x值改变而改变。 在C语言中有着相似的理解对于函数。...函数可以作为一段实现某一特定功能代码,可以像控制x值改变y值那样进行某些传参操作。 在了解完函数概念后,下面来了解下C语言中一般常见两种函数。...也就是说,标准函数库是由编译器发行厂商制作时进行添加,每个编译器库函数内容可能不一样,但是功能是按照C语言标准制作,功能实现效果和方法几乎是一样。...关于库函数相关头文件查询可以在C/C++官网或Cplusplus进行查询 。...https://zh.cppreference.com/w/c/header cplusplus.com/doc/ 在reference页面即可选择C library进行查看C语言库函数所在头文件信息

9310

C 语言指针详解

指针pp为指向指针p指针 定义指针变量 C语言中,定义变量时,在变量名 前 写一个 * 星号,这个变量就变成了对应变量类型指针变量。必要时要加( ) 来避免优先级问题。...引申:C语言中,定义变量时,在定义最前面写上typedef ,那么这个变量名就成了一种类型,即这个类型同义词。...在C语言中,我们让指针变量赋值为NULL表示一个空指针,而C语言中,NULL实质是 ((void*)0) ,  在C++中,NULL实质是0。...数组所占存储空间内存:sizeof(数组名) 数组大小:sizeof(数组名)/sizeof(数据类型),在32位平台下,无论指针类型是什么,sizeof(指针名)都是 4 ,在 64 位平台下,...函数与指针 函数参数和指针 C语言中,实参传递给形参,是按值传递,也就是说,函数中形参是实参拷贝份,形参和实参只是在值上面一样,而不是同一个内存数据对象。

2.4K11

C语言】递归详解

1.前言 这次博客内容是与递归有关,递归是学习C语⾔函数绕不开⼀个话题,那什么是递归呢?接下来正⽂开始。 2. 递归定义 递归其实是一种解决问题方法,在C语言中,递归就是函数自己调用自己。...来看看一个简单C语言递归代码 #include int main() { printf("hehe\n"); main();//main函数中⼜调⽤了main函数 return...在C语言中每一次函数调用,都要需要为本次函数调用在栈区申请⼀块内存空间来保存函数调用期间各种局部变量值,这块空间被称为运行时堆栈,或者函数栈帧。...当n大于2时就要实现前面两个数字,就要相加,然后将a和b都向后挪,也就是将b值给a,c值给b,然后再执行a+b,每执行一次n都要减减一下。...int Fib(int n) { int a = 1; int b = 1; int c = 1; while (n>2) { c = a + b; a = b; b = c;

21010

C语言指针详解

什么是指针 C语言中指针是一种数据类型,指针是存放数据内存单元地址。...C语言规定,变量地址只能通过取地址运算符获得,即“&”,其运算对象是变量或数组元素名,运算结果是对应变量或数组元素地址。...需要注意是,虽然地址是一个整数,但是C语言中不允许把整数看成“地址常量”,所以此处“地址型表达式”不能是整数。 2. 使用指针变量 格式:指针变量名 需要使用地址时,可以直接引用指针变量名。...='\0';string++){ printf("%c",*string); // I love China }; return 0; } C语言中,字符串是按字符数组进行处理...形参为指针变量、实参为数组名; 4. 形参为数组名、实参为指针变量 C语言中,函数可以返回整型、实型、字符型数据,也可以返回指针类型数据,即返回一个地址。

1.5K20

c语言 数组存放规则,C语言数组详解

下标表示了元素在数组中顺序号。数组元素一般形式为: 数组名[下标] 其中下标只能为整型常量或整型表达式。如为小数时,C编译将自动取整。...初始化赋值一般形式为: static 类型说明符 数组名[常量表达式]={值,值……值}; 其中static表示是静态存储类型, C语言规定只有静态存储数组和外部存储数组才可作初始化赋值(有关静态存储...C语言允许这种分解有二维数组a[3][4],可分解为三个一维数组,其数组名分别为a[0],a[1],a[2]。对这三个一维数组不需另作说明即可使用。...这是由于在C语言中规定,数组名就代表了该数组首地址。 整个数组是以首地址开头一块连续内存单元。如有字符数组char c[10],在内存可表示如图4.2。...设数组c首地址为2000,也就是说c[0]单元地址为2000。则数组名c就代表这个首地址。因此在c前面不能再加地址运算符&。如写作scanf(“%s”,&c);则是错误

5.8K30

C语言switch语句用法详解_c语言switch语句例题

大家好,又见面了,我是你们朋友全栈君。 C语言虽然没有限制 if else 能够处理分支数量,但当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错情况。...printf(“Sunday\n”); }else{ printf(“error\n”); } return 0; } 运行结果: Input integer number:3 Wednesday C语言还提供了另外一种多分支选择语句...需要注意是,当找到一个相等 case 分支后,会执行该分支以及之后所有分支语句。...这显然不是我们想要结果,我们希望只执行第四个分支,跳过后面的所有分支。 为了避免这种情况,C语言还提供了一个关键字 break,专门用于跳出switch语句。...以上就是对C语言switch语句资料整理,学习 C语言条件语句同学可以参考下。

1.5K30

C语言】文件操作详解

那是因为C语⾔程序在启动时候,默认打开了3个流: • stdin-标准输⼊流,在⼤多数环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。...= EOF) // 标准C I/O读取文件循环 { putchar(c); } //判断是什么原因结束 if (ferror(fp)) puts("I/O error when...缓冲区大小根据C编译系统决定。...; //注:fclose在关闭文件时候,也会刷新缓冲区 pf = NULL; } return 0; } 这里可以得出一个结论: 因为有缓冲区存在,C语言在操作文件时候,需要做刷新缓冲区或者在文件操作结束时候关闭文件...如果不做,可能导致读写文件问题。 9.结语 以上就是有关c语言文件操作知识啦~大家都学废了吗,完结撒花 ~

6010

C语言详解(三) - 数组

c99标准支持了变长数组创建,数组创建中元素个数可以是变量,但变长数组一旦创建数组长度(元素个数)便是确定。变长数组不能在创建时初始化。...C语言本身不对数组越界进行检查,数组越界时编译器也不一定会报错,所以一旦越界可能会导致严重错误。所以需要我们在写代码时自己有意识去检查。...特殊情况: 数组名单独作为sizeof操作数,数组名代表是整个数组,sizeof求是所占内存大小,所以sizeof(数组名)结果是整个数组大小,而不是数组首个元素(arr[0])大小。...,即&数组名时,数组名代表是整个数组,所以取出也是整个数组地址,而不是数组首元素地址。...回顾: 本文主要写了有关C语言数组内容。首先先了解了一维数组创建,初始化,使用和在内存中储存;然后就是二维数组创建,初始化,使用和在内存中储存。

59010

C语言:递归思想】详解

而套娃实际上就是在函数中再次调用同样函数。 以上便是递归核心理念了,再来看你是否把这个核心理念完整刻在你脑海当中去。...在编程语言当中我们知道,一个函数是可以调用另一个函数,那么有个特例如下: 如果函数调用了自己,我们便把函数在运行时候调用自己情况叫做是递归。...注:把x值给带入到f()函数当中去,尽管返回值参数是不一样。也一样带进去即可。 那么我们会知道③是一个确定数值,那么f(②)它是一个不确定值,又会等于多少?...2、当函数参数为②时候,它返回值就是 ② + f(①)。 3、以此类推下去,参数x值为①时候,函数返回值就是 ① + f(0)。...为了避免这种情况递归一定是要包含条件语句。 03  【栈(stack)】 在执行函数时候,函数内部局部变量存储单元都是可以在栈上进行创建,函数执行结束时候这些存储单元会被自动进行释放。

97030

C语言for语句用法详解

C语言中,for语句使用最为灵活,它完全可以取代 while 语句。它一般形式为: for(表达式1; 表达式2; 表达式3) 语句 它执行过程如下:先求解表达式1。...for语句最简单应用形式也是最容易理解形式如下: 小编给大家推荐一个学习氛围超好地方,C/C++交流企鹅裙:870963251!适合在校大学生,小白,想转行,想通过这个找工作加入。...例如: for( ; ; ) 语句 相当于: while(1) 语句 7) 表达式1可以是设置循环变量初值赋值表达式,也可以是其他表达式。...例如:for( i=0; (c=getchar())!=’ ’; i+=c ); 又如:for( ; (c=getchar())!...=’ ’ ; ) printf("%c",c); 循环嵌套 【例6-7】循环嵌套应用。

1.6K00

C语言】exit函数详解

一、exit函数定义 exit 函数是 C 标准库中函数,其原型定义在 stdlib.h 头文件中。exit 函数作用是终止当前程序执行,并返回一个指定退出码给操作系统。...其基本用法如下: #include void exit(int status);  具体功能分类有以下三种,不同类型对应不同使用环境: status 参数是程序退出状态码...这种情况下,操作系统会认为程序正常结束,可以在后续处理中根据返回退出码进行相应操作。                ...通常情况下,返回非零退出码表示程序发生了错误,可以在后续处理中根据返回退出码进行错误处理或日志记录。.../ 程序正常结束并返回退出码 0 return 0; } 总结 在 C 语言中,return 语句用于从函数中返回一个值,并终止函数执行。

9710

详解结构体--C语言

我们平时使用C语言类型类型主要是整数类型、浮点数类型以及指针类型,你是否想过我们该如何将一串不同类型数据整合起来,实现封装?...事实上,C语言也提供给我们一些自定义类型,让我们可以自由进行数据组合和使用。 结构体 结构体类型声明 结构体是什么? 结构体是一些值集合,这些值称为成员变量。...struct s1 { char c1; int i; char c2; }; c1对齐数是1,vs环境下默认对齐数是8,所以c1对应着偏移量为0位置,i是int 类型,占4个字节,...与8相比,较小是4,所以对齐数为4,所以偏移量为4位置,c2也是一个字节所以在偏移量为8位置,整个整个结构体偏移量为4,所以总大小必须为4倍数,所以还要再多消耗3个比特位,所以最终结构体大小为...struct A { int _a:2; int _b:5; int _c:10; int _d:30; }; 这里A就是位段 那么该如何计算位段大小呢? 位段内存分配 》1.

1.5K20
领券