###指针的用法
因为①函数的返回值类型只有一个,使用指针变量作为参数就可以得到多个变化的值,②char a[6] =“abcdde”,若是直接调用变量a[6],占用4x6个字节,但是用指针p指向a[6]首个元素地址,就节省内存。
指针也是一种数据,指针变量也是一种变量,因此指针 这种数据也符合前面 变量和内存 主题中的特性。强调2个属性: 指针的类型,指针的值。
#include<stdio.h>
int main()
{
int num=97;
int *p1 = # //&num 不仅包含了变量的地址 还包括存储的数据的类型
char *p2 = (char*)(&num);
int *p3;
printf("p1=%d\n", p1);
printf("*p1=%d\n", *p1);
printf("p2=%s\n", p2);
}
注意点
①:
int *p3=1; //这是不合法的
②:注意 p代表地址 *p代表p所指的地址对应的值
#include<stdio.h>
int main()
{
int a, b;
int *p1, *p2, *p;
scanf("%d %d", &a, &b); // Input 5 9
p1=&a; p2=&b;
if(a<b) {p=p1; p1=p2; p2=p;}
printf("max=%d min=%d\n", a, b); //max=5 min=9
printf("max=%d min=%d\n", p1, p2); //max=6684160 min=6684164
printf("max=%d min=%d\n", *p1, *p2); //max=9 min=5
return 0;
}
#include<stdio.h>
int main()
{
void swap(int *point1, int *point2);
int a, b;
int *p1, *p2;
scanf("%d %d", &a, &b);
p1=&a; p2=&b;
if(a<b) swap(p1,p2);
printf("max=%d min=%d\n", a,b); //注意这里是 a 和 b 不是point1 point2
return 0;
}
void swap(int *point1, int *point2)
{
int temp;
temp = *point1; //改变所指的单元的值
*point1 = *point2;
*point2 = temp;
}
区分
void swap(int *point1, int *point2)
{
int *temp;
*temp = *point1; //此语句有问题 在Dev可以 CFree运行无结果
*point1 = *point2;
*point2 = *temp;
}
区分
void swap(int *point1, int *point2)
{
int *temp;
temp = point1; //输出 max=5 min=9 指针间赋值 改变指向
point1 = point2;
point2 = temp;
}
c语言不能通过执行调用函数来改变实参指针变量的值,但是我们可以通过改变实参指针变量所指变量的值实现。例如本例子中 通过改变a 和 b 的值来实现。
#####数组名作为右值的时候,就是第一个元素的地址。
int main(void)
{
int arr[3] = {1,2,3};
int*p_first = arr; //首元素赋值
int*p = &arr[2]; //第二个元素地址赋给p
printf("%d\n",*p_first); //1
return 0;
}
int arr[3] = {1,2,3};
int*p = arr;
for(;p!=arr+3;p++){
printf("%d\n",*p);
}
return 0;
}
运算(p均指向a[0]) | 表示含义 |
---|---|
p++; *p; | 得到a[1] |
*p++; | 等价于*(p++),先得到 *p ,再使p的值加1 |
*(p++), *(++p) | *(++p)先p+1,再进行取值 |
++(*p) | 表示p所指的元素加1 |
p[i] | 表示*(p+i) ,如果p是指向a[2], i=1, 则表示a[3] |
#include<stdio.h>
int main()
{
int a[5]={0,2,4,6,8};
int *p1=a, *p2=a, *p3=a, *p4=a, *p5=p1+1;
printf("%d\n", *p1); //0
printf("%d\n", *p2++); //0
printf("%d\n", *(++p3)); //2
printf("%d\n", ++(*p4)); //1
printf("%d\n", p5[2]); //6
return 0;
}
cs