指针的用法

###指针的用法

1、为什么要用指针

因为①函数的返回值类型只有一个,使用指针变量作为参数就可以得到多个变化的值,②char a[6] =“abcdde”,若是直接调用变量a[6],占用4x6个字节,但是用指针p指向a[6]首个元素地址,就节省内存。

2、怎么引用指针变量

指针也是一种数据,指针变量也是一种变量,因此指针 这种数据也符合前面 变量和内存 主题中的特性。强调2个属性: 指针的类型,指针的值。

#include<stdio.h>
int main()
{
	int num=97;
	int *p1 = &num;  //&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; 
}

3、指针变量作为函数参数的用法
#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 的值来实现。

4、引用数组时指针的运算

#####数组名作为右值的时候,就是第一个元素的地址。

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;
}
带有 * + + 的指针运算 详细内容见P235
运算(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; 
}

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值