1、 指针和数组的关系
int a [10]={0, 1, 2, 3, 4, 5, 6, 7 ,8, 9} , v;
v=a [0]; //也可写成:v=*a;
v=a [3]; //也可写成:v=*(a+3);
v=a [4]; //也可写成:v=*(a+4);
一般而言数组名a 代表数组本身,类型是int[10],但如果把a 看做指针的话,它指向数组的第0 个单元,类型是int* 所指向的类型是数组单元的类型即int。因此*a 等于0。同理,a+3 是一个指向数组第3 个单元的指针,所以*(a+3)等于3。
2、数组元素的地址作为函数参数
intswap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
return 0;
}
int main (void)
{
int arr[] = {1,2};
int *a = &arr[0];
int *b = &arr[1];
swap(a,b);
}
由于数组元素的地址的本质仍然为地址,所以属于地址传递方式。swap函数是将a指向的地址赋给temp,把b指向的地址赋给a,将temp的值(也就是a指向的地址)给b。从而完成*a和*b指向的地址里的值的交换。
3、 运算符&和*的区分比较
&a 的运算结果是一个指针,指针的类型是a 的类型加个*,指针所指向的类型是a 的类型,指针所指向的地址就是a 的地址。
*p 的运算结果是p 所指向的东西,它有这些特点:它的类型是p 指向的类型,它所占用的地址是p所指向的地址。
4、 指针存放的内容
int a = 4;
int *p = null;
p = &a;
*p = 2;
这里假设a的地址是0Xff,a存放的值为4。
P = &a;意思是p指向a,p里存放的是a的地址0xff。
*p = 2;意思是把2赋值给*p,也就是把2赋值给p指向的变量,也就是把2放到p存放的那个地址里面放的值。就是2赋值给a,替掉4。
5、 数组名作函数参数与用数组元素作实参的区别
用数组元素作实参时,只要数组类型和函数的形参变量的类型一致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的。因此,并不要求函数的形参也是下标变量。换句话说,对数组元素的处理是按普通变量对待的。
用数组名作函数参数时,则要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组说明。当形参和实参二者不一致时,即会发生错误。
6、 如何通过传递数组指针返回多个值
#include<stdio.h>
voidmin_max(int *ptr,int n)
{
int *temp;
for(int i = 0; i < 5; i++)
{
if(*(ptr) > *(ptr+i))
{
*temp = *(ptr);
*(ptr) = *(ptr+i);
*(ptr+i) = *temp;
}
if(*(ptr + n-1) < *(ptr + i) )
{
*temp = *(ptr+n-1);
*(ptr+n-1) = *(ptr+i);
*(ptr+i) = *temp;
}
}
}
intmain()
{
int a[5];
for(int i = 0; i < 5 ; i++)
scanf("%d",&a[i]);
min_max(a,5);
printf("%d %d",a[0], a[4]);
return 0;
}
7、 回调函数
百度上说:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
回调函数的机制是:
⑴定义一个回调函数;
⑵提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;
⑶当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。
8、 函数指针
intadd(int num1, int num2)
{
return num1 + num2;
}
intmain(int argc, const charchar * argv[ ])
{
printf("result:%d", add(1,2));
printf("\n%p", add);
int (*p)(int,int) = add;
printf("\n%d", p(3, 4));
return 0;
}
函数指针是一个指向函数的指针。函数指针的目的就是为了实现方法的回调。上例定义了一个函数add,它是一个有两个参数,返回值为int的函数。printf("\n%p", add) 打印出来的结果就是函数add入口点的地址。
9、 指向指针的指针
char **pl;
char a;
a = ‘a’;
**pl = a;
1. pl是指针的指针,所以pl指向的是一个指针的地址,所以sizeof(pl)结果为8, 打印出来的pl是一个地址,由于pl指向的是一个“指针的地址”,而“指针的地址”存放的是char类型变量的地址,所以占8个字节,所以pl+1 比pl大8。
2. *pl指向char类型变量的,所以它存放的是char类型变量的地址,所以sizeof(*pl)结果为8。
3. **pl,获取char类型变量的值,由于是char类型,所以sizeof(**pl)结果为1。
最终打印结果:sizeof(pl):8
sizeof(*pl):8,
**pl:1 pl:0x7fff5fbff6b0
pl+1:0x7fff5fbff6b8
10、1.5625的二进制表示
整数部分和整型一样,所以为1;
小数部分0.5625 先* 2,得 1.125 。取整数部分1
剩下的小数部分0.125 再* 2,得 0.25 。得整数部分0
剩下的小数部分0.25 再* 2,得 0.5 。得整数部分0
剩下的小数部分0. 5 再* 2,得 1 。得整数部分1
所以为 1 . 1 0 0 1