? 含义:是一个值,一个值代表着一个内存地址,类似于存放路径? ?
? 1 字符*
表示指针
作用:通常跟在类型关键字的后面,表示指针指向的是什么类型的值
int * foo, * bar;
声明指针后会随机分配一个内存空间,指针指向的数据是随机的
指针的初始化:
int* p;
int i;
p = &i;
*p = 13;
未初始化的指针数据最好这样定义:int* p = NULL;
?2?运算符
作用:用来取出指针变量所指向的内存地址里面的值
* foo 取出定义的指针的值
作用:用来取出一个变量所在的内存地址
int i = 5;
if (i == *(&i)) // 正确,*(&i)含义:先取出i的内存地址,在获取内存地址对应的值
? ? ?1 指针与整数值的加减运算
? ? ? ? ? ?指针与整数值的运算,表示指针的移动。
? ? ?2?指针与指针的加法运算
? ? ? ? ? 两个指针进行加法是非法的
? ? ?3?指针与指针的减法
? ? ? ? ? 相同类型的指针允许进行减法运算,返回它们之间的距离,即相隔多少个数据单位。
? ? ? ? ? 高位地址减去低位地址,返回的是正值;低位地址减去高位地址,返回的是负值
? ? ? 返回值:ptrdiff_t
类型,一个带符号的整数类型别名
? ? ?4?指针与指针的比较运算
? ? ? ??比较的是各自的内存地址哪一个更大,返回值是整数1
(true)或0
(false)
#include <stdio.h>
/* 基础结构*/
int main(void)
{
int m = addNum(3); /* 使用函数, 3 传递的参数*/
printf("m=%d", m);
}
int addNum(int a) /* int addNum 定义函数名称 (int a 传递参数,可以传递多个,使用逗号分开) */
{ /*{函数体:使用此方法需要执行的语句}*/
return a; /* return a; return 返回值,返回计算之后的数据 */
}
传递的参数是拷贝的数据,非自身数据,不会实时更新数据;
除非
1 函数返回最新的数据,才可以获取并赋值最新的数据
2 直接修改自身的署,传入变量的地址(函数不要返回内部变量的指针)
void Swap(int* x, int* y) {
int temp;
temp = *x;
*x = *y;
*y = temp;
}
int a = 1;
int b = 2;
Swap(&a, &b);
函数可以调用自身,这就叫做递归(recursion)
例如:
#include <stdio.h>
int main(void)
{
int m = addNum(3);
printf("m=%d", m);
}
int addNum(int a)
{
a++ ;
if (a <= 5)
{
addNum(a);
}
else
{
return a;
}
}
注意:在使用递归函数时,注意做好判断,不然容易出现死循环
main()是程序的入口函数,所有的程序必须要有
类似于页面加载方法,首先执行此方法
其他的方法需要通过main调用
#include <stdio.h>
int main(void)
{
int m =3;
printf("m=%d", m);
return 0; /* 表示函数结束运行,返回0; 返回非零数据表示运行失败*/
}
调用函数的方法
// 写法一 常用的 函数名本身就是指向函数代码的指针,通过函数名就能获取函数地址
print(10)
// 写法二
(*print)(10)
// 写法三
(&print)(10)
// 写法四
(*print_ptr)(10)
// 写法五
print_ptr(10)
#include<stdio.h>
int addNum(int a)
{
return a;
}
int main(void) /*调用其他方法时,其他方法要么写在最前面, 或者使用函数原型*/
{
// int m = addNum(3);
// printf("m=%d", m);
int m = (*addNum)(10);
printf("m=%d", m);
}
优点:
可以明确参数是一个函数
参数一就是一个函数
int compute(int (*myfunc)(int), int, int);
函数原型:提前告诉编译器,每个函数的返回类型和参数类型
int twice(int);
int main(int num) {
return twice(num);
}
int twice(int num) {
return 2 * num;
}
注意,函数原型必须以分号结尾。
一般来说,每个源码文件的头部,都会给出当前脚本使用的所有函数的原型。
作用:终止程序的运行
前提: #include<stdlib.h>
返回值(stdlib.h已定义,无需定义):
EXIT_SUCCESS(相当于 0)表示程序运行成功
EXIT_FAILURE(相当于 1)表示程序异常中止
atexit()函数:
用来登记exit()执行时额外执行的函数,用来做一些退出程序时的收尾工作
extern int foo(int arg1, char arg2);
extern 表示:导入使用,声明此方法未在此文件定义,是从其他文件内引入使用的
int main(void) {
int a = foo(2, 3);
// ...
return 0;
}
1?用于函数内部声明变量时,表示该变量只需要初始化一次,不需要在每次调用时都进行初始化