day12

day10-指针
指针:
    硬件 
指针:
   指针+ 基本数据类型 
   指针+ 数组 
   指针+ 函数 
   指针+ 指针 
   
指针:
   指针
------------------------- 间歇性学习 
1. 指针 
   地址 ---- 内存单元的编号 
   pointer //指针
2. 黑客 

3.指针变量
语法:
   基类型* 指针变量名;
   
   基类型 --- 数据类型
           //基本数据类型 
           //数组类型 
           //基类型 表示 指针变量 指向的目标的 数据类型
   *      --- 表示此时定义的变量 是一个指针类型的变量 
        
   指针变量名 --- 标识符命名规则 + 见名知意         
  
  int * p; //表示定义了一个指针类型的变量   
    
  int a = 10;
  float b = 1.23;
  int *p = &a; //指针变量 p 指向 了 int型变量a    

  p变量的数据类型 int * //指针类型 
  
  &b --地址值 ---类型? 
      float 
      b有一块内存空间 -- 放的是float类型的数据 
      &b ---得到了一块 存放着 float类型数据的 空间的地址 

      float *p1 = &b;'

float b = 10;

&b --- > 地址值的类型 -->float *      
         b的数据类型--决定了这块空间放的的数据类型 
         &b         --获得了 这块空间 的地址编号 
            
            float *  //这种类型的地址数据 
            
            float *p1 =  &b;

举例区别含义
int arr[5]               //名为arr的数组,数组里有5个元素,每个元素是int
int* p1[5]              //指针数组,数组里有5个元素,每个元素是int*
int (*p2)[5]            //数组指针,一个指向数组(里面有五个元素,每个元素是int)的指                                  针
int (*p3[5])[5]        //p3[5]是一个有5个元素的数组,数组里每个元素是int(*)[5]
 

day12_第1张图片
      
---------------------------------------------------------
指针变量:
访问变量时:
直接访问 
间接访问 通过地址访问到的 

* 指针运算符
* 单目运算 
 运算数必须是指针类型的值(地址)

day12_第2张图片
 
 *p 过程
 1.首先拿出p指针变量中的值(地址) 到内存中定位 
 2.从定位处开始,偏移出sizeof(基类型)大小的一块空间 
 3.把这块空间当做一个 基类型的 变量来看  

指针数组和数组指针的区别

指针数组,如:int *p[3]
指针数组:指针数组可以说成是指针的数组,首先这个变量是一个数组。
其次,指针修饰这个数组,意思是说这个数组的所有元素都是指针类型。
在32位系统中,指针占四个字节,而在64位系统中,指针通常占八个字节
数组指针,如:int (*p)[3]
数组指针:数组指针可以说成是数组的指针,首先这个变量是一个指针。
其次,数组修饰这个指针,意思是说这个指针存放着一个数组的首地址,或者说这个指针指向一个数组的首地址
     
int a = 10; //整型  

int *p = &a;

printf("%d\n",*p);   //*p<=>a

a = 20;
*p = 20;
 

int addOne(int n) //[xxx]
{
  n = n + 1;
  return n;
}

int main(void)
{
  int n = 10;
  addOne(n);  //[10]
}

day12_第3张图片

day12_第4张图片

数组和指针的关系

day12_第5张图片

二级指针

day12_第6张图片

想实现:
被调修改主调 
1.想修改谁,就把谁的地址传过去 
2.必须要做*运算(间接访问),实现修改 

练习:
   求两个数的和 --函数 
   int add(int a,int b)
   {
      return a + b; //只能带出一个结果 
   }

数组指针

day12_第7张图片指向指针的指针

day12_第8张图片

练习:
    找出两个数中最大值 最小值 
练习:
    main函数中有两个数据
    a=10,b=20
    写个函数
    交换a b的值
    swap()    
----------------------------------------
指针的运算:
1. & 
2. * 
3. p+1  //指向了下一个一基类型的数据
        //跳过了一个基类型 
4. p++ 

//声明了一个普通变量 a
int a;
//声明一个指针变量,指向变量 a 的地址
int *pa;
//通过取地址符&,获取 a 的地址,赋值给指针变量
pa = &a;
//通过间接寻址符,获取指针指向的内容
printf("%d", *pa);

 遍历数组:递增一个指针

我们喜欢在程序中使用指针代替数组,因为变量指针可以递增,而数组不能递增,数组可以看成一个指针常量。
下面的程序递增变量指针,以便顺序访问数组中的每一个元素:

day12_第9张图片

day12_第10张图片

day12_第11张图片


指针 + 数组 
一维整型数组 

int a[5]; //a首元素的地址 
          //a[0]  -- int型 
          //&a[0] -- int * 
          

int *p = &a[0];
       = a;          
       
a[i] <=> *(a+i) //指针运算 


练习:
     找最大值 ,指针的方式访问  
     
     
野指针 ---指向不明确 ,随机
NULL 表示 0号地址 


 

你可能感兴趣的:(c语言)