zoukankan      html  css  js  c++  java
  • 2017.11.14 C语言---指针的学习

    第八章 善于利用指针

    (1)指针是什么
    1.内存区每一个字节都有一个编号,这就是“地址”。地址形象化的被称为“指针”。它能通过以它为地址的内存单元。地址指向(*)该 变量单元。指向就是通过地址来体现。【指针是一个地址,指针变量是存放地址的变量】

    2.在程序中一般是通过变量名来引用变量的值,这种直接通过变量名进行访问的称为直接访问;
    间接访问:将变量 i的地址存放在另一变量中,然后通过该变量来找到变量i的地址从而访问i变量。
    @
    (2)指针变量

    使用指针变量的地址
    例题1://通过指针变量访问整型变量
     
    #include<stdio.h>
    int main()
    {
    	int a=100;
    	int b=10;  //定义a、b整型变量,并初始化 
    	int *pointer_1;		//定义指向整型数据的指针变量pointer_1
    	//*pointer_1表示指针变量pointer_1所指向的变量,也就是变量a 100 
    	 
    	int *pointer_2;  //定义指向整型数据的指针变量pointer_2 
    	pointer_1=&a;   //把变量a的地址赋给指针变量pointer_1,
    	pointer_2=&b;	//把变量b的地址赋给pointer_2  
    	printf("a=%d,b=%d
    ",a,b);
    	printf("*pointer_1=%d,*pointer_2=%d
    ",*pointer_1,*pointer_2);
    	return 0;
     } 
    
    怎样定义指针变量

    定义指针变量额一般形式:**类型名 * 指针变量名 ** ,指针变量是基本数据类型派生出来的类型,它不能离开基本类型而独立存在
    @ 例如: int pointer_1,pointer_2;
    @
    在定义指针变量时,同时对它初始化。

    例如:   int *pointer_1=&a;,*pointer_2=&b;
    //指针变量前面的*表示该变量类型为指针变量。指针变量名为pointer_1 and pointer_2
    //不能写成“*pointer_1=&a;  and *pointer_2=&b;”a的地址是赋给pointer_1
    

    一个变量的指针的含义包括两个方面:一是以存储单元编号表示的地址(如编号为2000),一是它指向的存储单元的数据类型,说明变量类型时应该是这样说:a是指向整型数据的额指针变量,b是指向单精度数据类型的指针变量。
    @【指向整型数据的指针类型表示为 int ,读作“指向int 的指针”或者简称 “int指针”】
    @【指针变量不能存放地址(指针)不要将一个整数赋值给指针变量, 例如:
    pointer_1=10000;】

    两个有关运算符: &      取地址运算符      &a是变量a的地址
    			  *      指针运算符        *p代表指针变量p指向的对象
    

    怎样运用指针

    在引用指针时有三种情况
    1.给指针变量赋值;  例如:p=&a;//把a的地址赋给指针变量p;;;;int * 读作int指针
    2.引用指针变量指向变量; 例如:已执行p=&a; printf("%d",*p);  //a指向整型数据的指针变量
    3.引用指针变量的值;  例如: printf("%o",p);
    
    	例题2://输入ab两个整数,按先大后小的顺序输出a和b
    #include<stdio.h>
    int main()
    {
    	//int *p1;
    	//int *p2;//p1,p2的类型是int *型 
    	int *p;   
    	int a;
    	int b;
    	printf("please enter two integer numbers:");
    	scanf("%d,%d",&a,&b);
    	int *p1=&a;  //使p1指向变量a 
    	int *p2=&b;  //使p2指向变量b 
    	if(a<b)
    	{
    		p=p1;
    		p1=p2;
    		p2=p;//p1  p2互换值   //换成p1=&b;p2=&a;
    	 }
    	 printf("a=%d,b=%d
    ",a,b);
    	 printf("max=%d,min=%d
    ",*p1,*p2);
    	 return 0; 
     } 
     
     //a和b的值并未交换,它们仍保持原值,但p1和p2的值改变了,p1的值原为&a,后来变成了&b
    

    指针变量作为函数参数

    例题2://对输入的两个整数大小按大小顺序输出。先用函数处理而且用指针类型的数据作函数参数。
     
    #include<stdio.h>
    int main()
    {
    	void swap(int *p1,int *p2);//声明swap函数
    	int a;
    	int b;
    	int * pointer_1;
    	int * pointer_2;//定义两个指针变量
    	printf("please enter a and b:");
    	scanf("%d,%d",&a,&b);
    	pointer_1=&a;      //pointer1指向a
    	pointer_2=&b;      //pointer2指向b
    	if(a<b)
    	swap(pointer_1,pointer_2);//如果a大于b调用swap函数 
    	printf("max=%d,min=%d
    ",pointer_1,pointer_2);
    	return 0;
     } 
     swap(int *p1,int *p2)
     {
     	int temp;
     	temp=*p1;
     	*p1=*p2;
     	*p2=temp;
     }
    

    (3)通过指针引用数组

    1.数组元素的指针

    @一个变量有地址,一个数组包含若干个元素,每个数组元素都在内存中占用存储单元,它们都应有相应的地址。所谓数组元素的指针就是数组元素的地址。

    1可以用一个指针变量指向一个数组元素。引用数组元素可以用下标法也可以用指针法(好)
    	例如:
    				int a[5]={1,23,56,9,8};//定义a为包含5个整型数据的数组
    				int *p;  //定义p为指向整型变量的指针变量
    int *p=&a[2];//	p=&a[0];  //把a[0]的地址赋给指针变量p,p=1.
    
    2.在C语言中数组名(不包括形参数组名,形参数组并不占用实际的内存单元)代表数组中的首个元素。数组名不代表整个数组,只代表数组首元素的地址。
    	例如:p=&a[0];p的值是a[0]的地址
    		 p=a;//p的值是数组a首元素
    
    2.在引用数组元素时指针的运算

    指针就是地址。在一定条件下允许对指针进行加和减的操作运算。
    在指针指向数组元素时,可以对指针进行以下操作:

    加/减一个整数(+或+=),例如:p+1;p-1
    自加自减,例如:p++/p--
    两个指针相减,例如:p1-p2(p1和p2指向同一数组中的元素有效)
    

    分别说明如下:如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。注意:执行p+1时并不是将p的值简单地加一而是加上一个数组元素所占用的字节数。

    例如:数组元素是float型,每个元素占用四个字节,则p+1意味着使p的值加4个字节(实际上是p+1*d)d是一个数组元素所占的字节数
    对int型  每个元素占用4个字节;char型是一个元素为一个字节;float和double每个元素占用4个字节
    

    (5)通过指针引用数组元素
    引用一个数组元素可以用两种方法:下标法,例如a[i] ;指针法:(a+i) 或者 。(p+i)。其中a是数组名,p是指向数组元素的指针变量,其初值为p=a

  • 相关阅读:
    如何通过Restful API的方式读取SAP Commerce Cloud的Product图片
    Permute Digits
    Browser
    Jamie and Alarm Snooze
    Perfect Squares
    Color the ball
    Stars
    1086. Tree Traversals Again (25)
    1085. Perfect Sequence (25)
    1083. List Grades (25)
  • 原文地址:https://www.cnblogs.com/qichunlin/p/7835257.html
Copyright © 2011-2022 走看看