C-函数,数组指针,指针之间的运算

goto原理:

当执行到goto语句的时候, cpu就会跳转到当前函数指定的标志的地方

使用goto也可以实现循环操作

但是在使用的时候,要注意不要造成死循环

一般情况下不建议经常使用goto语句,因为不安全——容易造成死循环

除非在特别确定不会有死循环的情况下,才可以用goto

goto不仅可以往前跳,还可以往后跳

使用goto时, 标签代码行的下一行代码不能是声明变量,如果非要写在这个地方,那就在声明变量行前面加一句无意义的代码

标示符:  通俗来讲就是程序员可以自己命名的东西: 变量名,goto标签名, 函数名等

面试题3

for(int i = 0; i<10; i++ ){
    for(int j = 0; j<10; j++){
        //用一段代码,直接跳出外层循环
        i = 10;
        break
    }
}

函数的作用:可以实现代码的重用,函数只需要顶一次,那么函数中的代码可以随意使用

使用函数的注意:

1.函数的位置:main函数的外面

全局变量与局部变量

初始化

1.局部变量:未初始化的时候,是一个随机数

2.全局变量:如果是一个数值,那么就默认初始化为0;如果是char,默认初始化为’\0’,即ASCII码中的0

创建时间

1.局部变量:当运行到声明语句的时候才会创建,出了所在作用域就会被回收

2.全局变量:程序运行时就会被创建,程序结束时才会被回收

全局变量的特点:

1 int num = 10;
2 int main(){
3     printf(“%d\n”, num);  //这里是访问的全局
4     int num = 10;
5     printf(“%d”\n, num); //这里是局部
6 }

函数的参数

1.声明在 函数名称后面的小括弧中的变量,我们就叫做这个函数的参数

形参与实参的关系:

赋值

return 可以带常量, 也可以带表达式  当return 表达式的时候,   return的是表达式的结果

关于函数的声明和定义:

1.如果函数写了声明, 那么这个函数的定义就可以放在调用函数的后面了

2.函数的声明最晚也要放在函数调用之前,一般情况下写在最顶部

3.如果被调函数在主调函数之前,这个时候,被调函数的声明可以省略,直接写定义即可;如果被调函数的定义在主调函数的后面,那么这时候必须在调用之前声明被调函数

4.声明函数的函数投,必须要和实现函数的函数头一致(参数可以不一致,只不过返回值或者结果紊乱)

5.在声明函数的时候,如果函数有参数,那么参数的名称可以省略(但是强烈建议声明实现统一)

6.如果函数的返回值是int类型的,可以不写声明,因为缺省就是int类型的(但是会给出警告,所以还是要写一下的)

-=-=-=-=-=-=-函数编写规范-=-=-=-=-=-=-

1.main函数无论如何排在第一位

2.无论什么情况,函数都要写声明和实现

声明写在最顶部,#include 下面

实现写在main函数后面

3.声明和实现一致

指针之间的运算

为什么两个指针变量之间不能进行加法运算?以及乘法和除法

1.加法的话,加完以后有可能会越界,超出了数组的地址界限,溢出

2.乘除法同理

作用:

1.判断两个指针指向的变量是否是同一个,如果是,那么相减的结果是0

2.判断两个指针指向的变量是否相邻,如果是,那么相减的结果是正负1

两个指针变量(p1, p2)之间的关系运算

p2 > p1

结果等于1     p2在高位

结果等于0 p1在高位,或者指向同一个元素

二维数组与指针

有二维数组 int array[][] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}}

则易得: array[0] 为第一行的第一个元素,也是第一行的首地址

推理可得: array[0]+1, array[0]+2, array[0]+3 即为第一行的第2, 3, 4个元素

约定: array[0], array[0]+1, array[0]+2, array[0]+3 为二维数组中的列指针

又易得: array 为第一行的首地址

所以推理可得:array+1是 第二行的首地址

array+2是第三行的首地址

约定:array, array+1, array+2 为二维数组中的行指针

数组指针:

定义一个指针变量,让这个指针变量指向一维数组的元素

二维数组指针:

行指针: 用来指向二维数组的每一行,存放的是行的首地址

形式: 数据类型 (*指针变量名)(数组的第二维的长度)

二维数组指针的初始化

1 int a[2][3];
2 int b[2][2];
3 float f1[4][4];
4 //假设要定义一个指向数组a的行指针
5 int (*pa)[3] = a[0];  //a[0] == a == &a[0] ==&a[0][0]
6
7 //二维数组的使用
8 *(*(p+i)+j)   //获取二维数组的每个元素
时间: 2024-10-20 14:35:41

C-函数,数组指针,指针之间的运算的相关文章

数组和标量之间的运算

数组很重,因为它使你不用编写循环即可对数据执行批量运算.这通常叫做矢量化(vectorization).大小相等的数组之间的任何算术都会将运算应用到元素级. 1 In [35]: sim = np.array([[1.,2.,3.],[4.,5.,6.]]) 2 3 In [36]: sim 4 Out[36]: 5 array([[ 1., 2., 3.], 6 [ 4., 5., 6.]]) 7 8 In [37]: sim * sim 9 Out[37]: 10 array([[ 1.,

Numpy的array数组和标量之间的运算

矢量化 数组很重要,因为它使你不用编写循环即可对数据执行批量运算.这通常就叫做矢量化(vectorzation) 数组与数组的运算 数组与标量的算术运算

常见指针:指针函数 函数指针 指针的指针 指向指针数组的指针

一.指针函数与函数指针 在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1.指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符    *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值.函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量. 表示: floa

C语言中的函数、数组与指针

1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念:  函数是C语言代码的基本组成部分,它是一个小的模块,整个程序由很多个功能独立的模块(函数)组成.这就是程序设计的基本分化方法: (1) 写一个函数的关键: 函数定义:函数的定义是这个函数的实现,函数定义中包含了函数体,函数体中的代码段决定了这个函数的功能: 函数声明:函数声明也称函数原型声明,函数的原型

深入理解 [指针函数] 、[函数指针]、[指针的指针]、[指向指针数组的指针]

指针函数 1.指针函数是指带指针的函数,即本质是一个函数.当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中. 函数返回类型是某一类型的指针: 格式: 类型标识符  *函数名(参数表) int *match(void *key_x,void *key_y); 解析:首先来说它是一个函数,只不过这个函数的返回值是一个地址值.函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针

#运算符、不同的指针类型、数组和指针、指针运算、堆、栈、静态区、只读区、下标VS指针

#运算符:用于在预编译期将宏参数转换为字符串 #define CONVERS(x)  #x   //注:没用双引号包括. 不同类型的指针占用的内存空间大小相同. 局部变量 定义: a[5]; 打印a[i]时,a[i]为随机数. 若定义a[5]={1,2}; 打印时,a[0]=1;a[1]=2;a[2]=a[3]=a[4]=0; 数组地址与数组名: 1.数组名代表数组首元素的地址.  a=&a[0]; 2.数组的地址需要用取地址符号&才能得到 (&a) 3.数组首元素的地址值与数组的

指针数组vs数组指针 指针函数vs函数指针

在分辨这些重要的概念时,我们先回顾一下前面所讲的C之三值合一,由于三个值所求出的地址是相同的,所以经常有传言说他们都是首元素的地址.这种说法是不正确的.为什么说它是不正确的呢? 首先定义一个指针,将三个值赋给它 *p=ar; *p=&ar[0]; *p=&ar//出错 程序编译后在表达式*p=&ar时出错,说明ar并不是指针类型.ar是数组名代表的是整个空间,因此ar应该是数组指针. 这四个概念看起来很容易混淆,但实际上只需要记住再看这些概念的时候先看后两个字,就可以看出它的类型,

【C/C++学院】0726-cppIDE/一级指针/指针数组/函数指针/函数指针数组/二级指针

[送给在路上的程序员] 对于一个开发者而言,能够胜任系统中任意一个模块的开发是其核心价值的体现. 对于一个架构师而言,掌握各种语言的优势并可以运用到系统中,由此简化系统的开发,是其架构生涯的第一步. 对于一个开发团队而言,能在短期内开发出用户满意的软件系统是起核心竞争力的体现. 每一个程序员都不能固步自封,要多接触新的行业,新的技术领域,突破自我. cppIDE 使用mfc和codeblocks中的mingw编译器.执行system命令中的bat批处理脚本. 一级指针 指针,结构体struct,

指针 指针与数组 指针与字符串 指针与函数 结构体与指针 宏

指针 指针与数组 指针与字符串 指针与函数?? 指针与数组 1.数组名:数组元素首地址 eg: int array[3]={1,3,6}; 这里array 恒等于&array[0] 2.int *p = a; int *p = 0; int a[]={0}; 3.int *p = a; 均指向数组的首地址 *p是? *(p+1)是?(*p)+1是? *(p+1)决定向下移动几个字节是类型 4.指针可以当数组名使用 p[1] = 3; 恒等于a[1] ;恒等于*(p+1);恒等于*(a+1) 5.