int arr[]={1,2,3,4,5}; 而所对应的下标为0,1,2,3,4。...printf("p1=%p\n", p1); printf("p1+1=%p\n", p1+1); printf("p2=%p\n", p2); printf("p2+1=%p\n",...2. 指针-指针 在指针变量相同类型时,计算出的是中间间隔的个数。...int ret = p1-p2 ; printf("%d\n", ret); return 0; } 结果为 指针类型不同时不能进行指针的加减运算。...2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。 除此之外,任何地方使用数组名,数组名都表示首元素的地址。
形参用字符指针变量接收arr,count作为计数器,记录字符个数,当记录到’\0'时,循环停止,返回count; 二,使用指针访问数组 1.1一维数组 int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10...代码展示: int main() { int arr[10]={1,2,3,4,5,6,7,8,9,10}; int (*p)[10]=&arr; for(int i=0;i<10;i...int a=10; int* p1=&a; int** p2=&p1; 对指针变量p2来说,它先于*结合,证明他是一个指针,再与int*结合,证明它所指向的对象是整形指针类型,是一个二级指针。...int* arr[10];//arr先于[10]结合,说明它是一个数组,再与int*结合,说明它的元素类型是int* 指针数组模拟二维数组 这里,arr1就是一维数组arr1首元素地址, 同理,arr2,...int arr1[3]={1,2,3}; int arr2[3]={2,3,4}; int arr3[3]={3,4,5}; int *arr[3]={arr1,arr2,arr3};
我们可以看到在main函数内部,创建了a和b,a的地址是0x009af998,b的地址是0x009af98c,在调用Swap函数时,将a和b传递给了Swap函数,在Swap函数内部创建了形参x和y接收a...* pc = &c;//字符指针 printf("%c\n", *pc);//字符指针解引用 return 0; } 字符指针只有一种使用方式吗?...正确形式: #include int main() { char* pc = "abcdef"; printf("%c\n", *pc); printf("%c\n", *(pc...我们一起来看看: C/C++会把常量字符串存储到单独的⼀个内存区域,我们知道常量字符串是不可以被修改的,既然不可以被修改,那么内容相同的常量字符串只需要保存一次就好了,当⼏个指针指向同⼀...; int* pc = &c;*/ int* p[3] = { &a,&b,&c }; //下标 0 1 2 int i = 0; for (i = 0; i < 3; i
一个整型占4个字节,短整型占2个字节,长整型占8或者4个字节,更长的整型占8个字节。 有人就问了,欸long为什么是两种情况,这是因为C语言中规定占字节数long>=int,取决于多少位系统。...相信不少刚接触C语言的认为答案是1.5,那么结果是否如此呢?...当然,也可以进行连续赋值,如: int a = 1; int b = 2; int c = 0; c = b = a+3;//连续赋值,从右向左依次赋值 C语言支持这种写法,但是这种代码不易理解,所以建议拆开写...复合赋值符 写代码的时候我们经常会对一个数进行自增自减的操作,如下 int a = 0; int b = 0; a = a+3; b = b-2; C语言中提供了更加方便的写法 int a = 18;...三目操作符,即是有三个操作数的,在C语言中有且仅有一个三目操作符, 实现代码是 (exp1 ? exp2:exp3)exp是表达式的意思。
今天来写一个c语言小程序 内容:比较两个实数的大小 代码演示 #define _CRT_SECURE_NO_WARNINGS #include int main() { int a..., b, c; printf("请输入两个实数:\n"); scanf("%d%d", &a, &b); c = a > b ?...a : b; printf(" the max of (%d,%d) is %d", a, b, c); return 0; } 这是一个小练习,新手可以自己动手练习一下
2.&数组名,这里的数组名表示整个数组,取出整个数组的地址。整个数组的地址和数组首元素地址是完全不一样的。 除去上面的特殊情况,其他地方使用数组名,都是首元素地址。...,有关二级指针的运算,我们可以通过*p2,也就是对p2进行解引用找到p1,再对p1解引用找到n,从而对n进行修改。 四.指针数组 指针数组就是存放指针的数组。
while(line<=20000) { line++; printf("我要继续努力敲代码\n"); } if(line>20000) printf("好offer\n"); return 0; } 6C语言中如何实现循环呢...C语言中给了数组的定义:一组相同类型元素的集合 8.1数组定义 数组的作用就是存放一组相同类型的数,[]里面是数组的大小,10表示这个数组可以存放10个元素,arr是数组名,int是表示这个数组是整形数组...int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素 8.2数组的下标 C语言规定:数组的每个元素都有一个下标,下标是从0开始的。...在C语言中,0表示假,非0表示真。&和*我们讲指针时再讲。·~后期讲。 !就可以把真假互换。 sizeof可以计算类型大小。...感谢大家的阅读,下期我们将结束初识C语言,让我们下期再见。
类型在c语言中为什么有这么多种?因为应用场景不同,解决应用场景应对方式不同,需要空间的大小也不同。 sizeof不仅可以求内置类型,还能够求自定义类型。...char c=0这样写是没有问题的,但是不便于用户理解。...那么,我们就理解了,对于多少位,应该是这样一个范围: 那么,就让我们根据一些练习题练习一下,看看是否掌握了吧 int i=-20,等于2的4次方+2的2次方,因为都是4个字节,所以都是32个比特位。...3次方+2的1次方 0000 0000 0000 0000 0000 0000 0000 1010 + 1111 1111 1111 1111 1111 ...所以c99当中的bool类型可移植性较好。 运行下面这个程序: 我们会发现输出结果是1 2 3。 第一种比较方法不推荐,因为我们会误认为是整数比较。第二种方法也不推荐,false只有C99支持。
数据类型;常量,变量 数据类型 c语言如何描述:常量——不能改变的量; 变量——能被改变的量 定义变量的方法 #下表为定义整型变量的示范案例,最终执行结果为...#include int main() { int age=20; age=age+2; printf("%d\n",age); return 0; } 打印时需注意:1....打印整型——%d 2.打印单精度浮点型(float)——%f 3.打印双精度浮点型(double...2.全局变量的作用域的是整个工程。 生命周期:变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。 ...2.全局变量的生命周期是:整个程序的生命周期。
接下来,我们用一个简单的例子来进行更好的理解 例:找四个数的最小值 #include int max4(int a, int b, int c, int d) { int max2(...int m, int n);//函数声明 int max = a;//最大值最开始假设为a max = max2(max, b);//把a,b的较大者赋给max max = max2(max, c...m : n;//条件表达式 } int main() { int a = 0, b = 0, c = 0, d = 0; printf("请输入四个整数:"); scanf("%d %d %d %...d", &a, &b, &c, &d); int ret = max4(a, b, c, d); printf("最大值为%d\n", ret); return 0; } 我们可以看到,在main...局部变量和全局变量在前面 C语言基础 中讲过,这里就不再进行更多的描述,可以简单理解为局部变量是在{ }内部定义的变量,而全局变量是在{ }外部定义的变量。
既然指针变量的大小与类型没有关系,那为什么还要有不同的指针类型呢?
先说一下C语言中的运算是什么?C语言中的运算就是对数据进行操作、处理的过程。那么运算符又干什么的呢?运算符就是指定该运算的处理方式。 那么C语言中又有哪些运算符呢?...如下所示: ※ 算术运算符 ※ 赋值运算符 ※ 关系运算符 ※ 逻辑运算符 ※ 三目运算符 2、算术运算符 C语言基本算术运算符如下表: ?...那么C语言中的赋值运算符又是什么呢?...那么上面所说的能不能在C语言中表示出来呢?当然是可以了,不过C语言中,需要用到一个符号,这个符号就是三目运算符。 C语言中的三目运算符:“?:”,其格式为: 表达式1 ?...解析:C语言中运算符中最高等级的为(),因此执行过程为: 1、先计算a>3和a+3的结果,计算后算式为1*a-14%3; 2、再计算1*a和14%3的结果,计算后算式为11-2; 3、最后算出结果为9。
C语言中的模2除法: 模2除做法与算术除法类似,但每一位除(减)的结果不影响其它位,即不向上一位借位。所以实际上就是异或。然后再移位移位做下一位的模2减。...步骤如下: a、用除数对被除数最高n位做模2减,没有借位。 (模2减规则:0-0=0 0-1=1 1-0=1 1-1=0) b、除数右移一位,若余数最高位为1,商为1,并对余数做模2减。...c、一直做到余数的位数小于除数时,该余数就是最终余数。...1011 ———— 01000 1011 ———— 00110 2.
虽然a是不能被修改的,但是本质上还是变量,也称为常变量 //a = 20;a会报错 int arr[a];//在C++中没有报错,const修饰的变量就是常量,在C语言中会报错 printf("...2.assert断言 assert.h头文件定义了宏assert(),用于在运行时确保程序符合指定条件,,如果不符合,就报错终止运行,这个宏被称为“断言”。 assert(p !...//写一个函数,交换两个整数的内容 #include void swap2(int *pa, int*pb) { int tmp = 0; tmp = *pa; //tmp=a.../b=tmp } int main(void) { int a = 10; int b = 20; printf("交换前:a=%d b=%d\n", a, b); //10 20 swap2(
2.当我们知道数组首元素的地址的时候,因为数组是连续存放的,所以通过指针就可以便利访问数组。 3.数组是可以通过指针来访问的。 一、二级指针 2.指针数组 指针数组是指针还是数组?
#include int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; printf("&arr[0] = %p\n", &arr...到这里大家应该搞清楚数组名的意义了吧 2. 使用指针访问数组 有了前面知识的支持,再结合数组的特点,我们就可以很方便的使用指针访问数组了。...#include void test(int arr[]) { int sz2 = sizeof(arr)/sizeof(arr[0]); printf("sz2 = %d\n",...sz2); } int main() { int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int sz1 = sizeof(arr)/sizeof(arr[0]); printf...指针数组模拟二维数组 #include int main() { int arr1[] = {1,2,3,4,5}; int arr2[] = {2,3,4,5,6}; int arr3
需要注意的是,这个操作只能在.c文件下操作。...2.const修饰指针 const修饰指针有两种情况,const可以放在*号的左边,也可以放在*号的右边,意义是不一样的 1.const放在*号的左边: 当我们编写这样的代码并进行编译的时候,编译器会报这样的错误...2.const放在*号右边 编写如上图代码时,编译器又会报错,这时候就告诉我们,此时指针变量pa存放的地址是不能被修改的,就是pa不能存放其他变量的地址,但是*pa的值可以被修改: 综上: 当cosnt... int main() { int *p; //指针没有初始化,没有具体指向的对象,系分配随机值,这就是野指针 *p = 20; return 0; } 2....2.传址调用和传值调用 传址调用和传址调用,顾名思义就是,一个传地址,一个传数值。这两者有什么区别呢?
; 3.条件语句 在C语言里面,我们可以把我们想要注释掉的语句放到if(0)里面,这样同样可以实现语句的注释的功能,因为在C语言里面1是真的,0是假的,如果是if(0),这样就不会执行大括号里面的语句;...但是我们不建议这样做,我们仅仅需要看懂别人的这种写法; 4.布尔类型 true表示真值,false表示假的,在我们的书里面,大部分使用的是C89,C90的版本,所以并没有提及到,实际上在C99标准里面,...,有的平台可以正常运行,有的平台就不支持,因此,我们并不推荐微软的这套写法;其实布尔类型的本质和我们的C语言里面的0表示假,1表示真是一样的效果; 这个类型的使用需要包含我们的头文件stdbool.h;...C语言里面的返回值可以不带类型,默认的是int类型,但是我们还是要写的,防止阅读我们的代码的人理解错误:是忘记返回值的类型,还是使用的默认的返回值的类型,为了避免这样的模棱两可的情况,我们应当写上返回值的类型...这个函数不需要进行传参; (5)void*可以用来定义变量,void*是指针,指针的大小是明确的,就是4/8个字节;void*可以被任何类型的指针接受,也可以接受任何类型的指针(通用接口,例如我们常见的内存函数),但是在C语言里面
最 好的安排是在某个相关的 .c 文件中定义, 然后在头文件 (.h) 中进行外部声明, 在需 要使用的时候, 只要包含对应的头文件即可。...定义变量的 .c 文件也应该包含该头 文件, 以便编译器检查定义和声明的一致性。这条规则提供了高度的可移植性: 它和 ANSI C 标准一致, 同时也兼容大多 数 ANSI 前的编译器和连接器。...Unix 编译器和连接器通常使用 “通用模式” 允许 多重定义, 只要保证最多对一处进行初始化就可以了; ANSI C 标准称这种行为为 “公共扩展”, 没有语带双关的意思。...特 别是, 永远不要把外部函数的原型放到 .c 文件中: 通常它与定义的一致性不能得 到检查, 而矛盾的原型比不用还糟糕。 有时候,正是那些意想不到之人,成就了无人能成之事。 ——图灵
int arr[]) { int sz2 = sizeof(arr) / sizeof(arr[0]); printf("sz2=%d", sz2); } int main() {...//假设是9 8 7 6 5 4 3 2 1 0, //而9和相邻的数换位置要换9次,换完位置就是这样的 //8 7 6 5 4 3 2 1 0 9 //9已经换好了,可以不用动了...在C语言中,int*arr[5] 声明了一个包含5个元素的数组,每个元素都是一个指向int类型数据的指针。这个数组可以存储指向整数的指针,可以是指向整数变量的指针,也可以是指向整数数组的指针。...int*arr[5] 还可以用于指向整数数组的指针,例如: int array1[3] = {1, 2, 3}; int array2[3] = {4, 5, 6}; int* arr[2] = {...array1, array2 }; 在这个例子中,arr数组的元素arr[0]和arr[1]分别指向array1和array2这两个整数数组的首地址。