c语言指针浅理解
指针指向一个地址用*作为解引用运算符进行解引用
声明可以是
int *pi;
char *pc;
float * pf, *pg;
1 int nurse = 22;
2 int * ptr;
3 ptr = &nurse; //指针是指向地址,指向nurse的指针
4 val = *ptr; //解引用,把nurse地址处的值赋给val
指针输出有专门的%p 输出为十六进制,虽然%x也是十六进制,但两者是不同的,指针输出用%p
指针的值是它指向对象的地址,指针加一,指针的值递增它所指向类型的大小
例如 int * p;
p指向一个地址,以%p的方式输出是一个十六进制的值,再以同样方式输出p+1,结果比p的结果大4
因为int类型占四个字节,p+1是将p地址加一个int类型大小
函数中使用指针
如果要用函数计算数组中所有值的和可能用
total = sum(marbles);
则函数中的形参类型应该是指针,因为实参marbles是数组首元素的地址,指针也是取地址;
1 int sum(int * ar, int n)
2 {
3
4 int total = 0;
5 for(int i = 0;i < n; i++)//n是指数组元素个数
6 {
7 total += ar[i]; //ar[i]和*(ar+i)等价
8 }
9
10 return total;
11 }
数组中指针求差
两个指针之差的差值是两个元素的距离,差值单位和数组类型的单位相同;
例如
1 # include<stdio.h>
2 int main(void)
3 {
4
5 int ar[5] = {1,5,8,7,6};
6 int *p1,*p2;
7 p1 = ar;//指向ar数组首元素地址
8 p2 = &ar[4];
9 printf("%p,%p,%d\n",p1,p2,p2-p1);
10
11 return 0;
12 }
结果
差的结果为4,意思是两个指针指向的元素差4个int类型,不是四个字节
因为指针使得数据容易被修改,为了安全在数据前加const
多个函数处理一个数据在不需要修改数据的函数形参加const