当前位置 博文首页 > 空手道丶大师兄的博客:指针的用法

    空手道丶大师兄的博客:指针的用法

    作者:[db:作者] 时间:2021-07-18 22:22

    ###指针的用法

    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; 
    }
    
    
    cs
    下一篇:没有了