地址和指针概念
地址:在计算机内存中,每个存储单元都有一个唯一的地址,就像我们现实生活中的门牌号码一样。通过这个地址,我们可以找到相应的存储单元,从而访问其中存储的数据。
指针:指针则是一个特殊的变量,它存储的是内存地址。可以将指针想象成一个箭头,它指向了内存中的某个位置。通过指针,我们可以间接地访问到指针所指向的内存地址中的数据。
指针变量
定义:存放变量地址的变量是指针变量,它用来指向另一个变量。
基类型 * 指针变量名;
- 整型是用来装整数的数据类型。
- 指针是用来装地址的数据类型。
指针变量只能存放地址(指针),不能将一个整数或任何其他非地址类型的数据赋给一个指针变量。
& | 取地址运算符 | 二级 | 自右向左 |
* | 指针运算符 | 二级 | 自右向左 |
int main(void)
{
int a = 10;
int *p;
p = &a;
printf("%d\n",a);
printf("%d\n",*p);
return 0;
}
- 通过指针变量中的值到内存空间中定位。
- 从定位处开始向后偏移sizeof(基类型)。
- 将偏移好的那部分内存空间当作是一个基类型来看。
函数调用时,一般为值传递,因此不能直接访问,需要通过指针来取地址进行间接访问,从而能够在被调函数中修改主调函数。
int main(void)//验证大小端字节序
{
int i = 1;
char *p = (char *)&i;//强制类型转换
if(*p == i)
{
printf("little\n");//小端存储
}
else
{
printf("big\n");
}
return 0;
}
数组与指针
数组也可以作为指针,数组传参时本身传递的就是首元素地址。
a[i] <---> *(a + i)
指针数组求和
//指针数组求和
int main(void)
{
int a[] = {1,2,3,4,5,6,7,8,9,0};
int len = sizeof(a) / sizeof(a[0]);
int i;
int sum = 0;
int *p = a;
for(i = 0;i < len;++i)
{
sum += *(a + i);
}
printf("%d\n",sum);
return 0;
}
当指针为空指针,指针当前状态为不可访问。int *p; p = NULL;
二分查找
int *binaryFind(int *a,int len, int n)
{
int begin = 0;
int end = len - 1;
while(begin <= end)
{
int mid = (begin + end) / 2;
if(*(a + mid) > n)
{
end = mid -1;
}
else if(*(a + mid) < n)
{
begin = mid + 1;
}
else
{
return a + mid;
}
}
return NULL;
}
使用函数递归完成数组遍历
void printArray(int *a, int len)
{
if(len == 0)
{
return;
}
else
{
printf("%d\n",*a);
return printArray(a + 1,len - 1);
}
}