指针有类型 但是地址没有类型
因为他们在读取的时候在栈中有相应的位置。
int *p=NULL
这时候不能直接读取*p的值,因为这是系统的地址
//多级指针
不能直接通过定义变量的形式存放指针然后获取其中的数值,因为*必须作用于指针类型
void main(){
int i=23;
int *p=&i;
int **q=&p; //这时候q存储的就是p的地址值,然后*q获取p存储的i的地址值,**q就获取了i的数值
printf("%d\n",**q);//这样才能获取i的值
}
下面的方法就不行了
void main(){
int i=21;
int *p=&i;
int *q=&p;
printf("%d\n",**q);//这样会报错,因为*q没有定义为指针,*只能作用在定义为指针的变量上,这样**q就不正确了。
}
数组的变量名 就是数组的首地址也就是第一个元素的地址
array &array &array[0] 都是相同的地址
指针的加法
p++ 这样指针p向前移动4个字节
指针的运算 一般在数组遍历的时候才有意义,
打断点后,点击调试 --》窗口--》内存 然后通过打印的地址查询
debug f11下一步
函数指针
函数的返回值类型 ,函数指针的名称,函数的参数列表
void(* fun_p)()=msg
fun_p();//就能调用msg函数 这样的能够把具体的函数抽象出来一定的结构的函数,并且调用。相当于函数的泛型,这样就能将函数当做参数传递过去。
int add(int a,int b){
return a+b;
}
int minus(int a,int b){
return a-b;
}
int handle(int (* func)(int a,int b),int a,int b){
return func(a,b);
}
void main(){
printf("%d\n",handle(add,123,3));这里相当于泛型的使用
}
点击反汇编 在内存中查看存放的数据
能够将函数作为参数传递给某个函数作为参数
函数的名称 就是函数的地址
类似Java中的将对象传递过去,其实也是利用的地址相同的原理
文档查询
随机数
srand()需要设置seed ,一般使用当前的时间srand((unsigned)time(NULL)) 注意引入头文件 #include <time.h>
然后在用rand()生成相应的随机数。
void main(){
intids[10];
//这样保证随机数的是变化的,否则会一直用最初的产生的随机数
srand((unsigned)time(NULL));
for (int i = 0; i < 10; i++){
ids[i] =rand() % 100;
printf("%d\n", ids[i]);
}
}
存储指针的时候,使用int 或者float并没有区别,但是如果使用*指针 取出当前的值的时候,就会因为类型不同出现错误。
因此定义指针一定要和定义的指针岁所对应的数据类型相匹配。
void main(){
double *q;//这是声明q是存放指针
double i=23.3;
q=&i; //这时候q就是存放指针的变量,
printf("%#x,%lf",q,*q);
}