嵌入式系统学习Day12(C语言中的指针)

一.地址和指针的概念

一个变量的地址称为该变量的”指针”。指针就是地址,地址就是内存单元的编号。例如,地址2000 是变量 i 的指针。如果有一 个变量专门用来存放另一变量的地址(即指针),则它称为”指针变量”。c语言为了能够表示这种特殊的数据,专门设计一种数据类型 --- 指针类型。

二.变量的指针和指向变量的指针变量

1 定义—个指针变量

C 语言规定所有变量在使用前必须定义,指定其类型,并按此分配内存单元。指针变量不同于整型变量和其他类型的变量,它是用来专门存放地址的,必须将它定义为”指针类型”。

基类型 *  指针变量名;
    (1)  (2)       (3)

(1)基类型    
        基类型说明了 通过指针 找到的空间
        a.多大
        b.怎么用
        就是 指针找到的空间上 所存储的 数据类型 
(2) *    
       只是一个修饰符 
       用来说明现在定义的变量,不是普通变量,而是指针变量 
(3)指针变量名
       是个标识符 ,符合标识符命名规则 

2 指针变量的引用

(1) &:取地址运算符。

(2) * : 指针运算符(或称“间接访间”运算符),取其指向的内容。

例如,&a 为变量 a 的地址, *p为指针变量 p所指向的存储单元的内容(即 p所指向的变量的值)。

# include <stdio.h>
void main()
{int a,b;
int * pointer_1,* pointer_2;
a=100;b=10;
pointer_1==&a;/*把变量a的地址赋给pointer_1*/
pointer_2=&b;/*把变量b的地址赋给pointer_2*/
printf("%d,%d\n”,a,b);
printf("%d, %d\n", * pointer_1,* pointer_2);
}

3 指针变量作为函数参数

函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用 是将一个变量的地址传送到另一个函数中。

eg:
   实现一个函数,得到两个整数 和  和  差 

int add(int a,int b,int *p1,int *p2)
{
*p1=a+b;
*p2=a-b;
}
int main(void)
{
int a,b;
scanf("%d%d",&a,&b);
int p1,p2;
add(a,b,&p1,&p2);
printf("%d %d\n",p1,p2);
return 0;
}


eg:
   实现一个函数,找出两个整数中的最大值 和 最小值 

int maxmin(int a,int b,int *max,int *min)
{
    if(a>b)
    {
        *max=a;
        *min=b;
    }else
    {   *max=b;
        *min=a;
    }
}
int main(void)
{
    int a,b;
    scanf("%d%d",&a,&b);
    int max,min;
    maxmin(a,b,&max,&min);
    printf("max=%d ,min=%d\n",max,min);
    return 0;
}

三.数组与指针

本篇只学习指针+整形一维数组

1.指向数组元素的指针

定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。

例如: int a[10]; (定义 a 为包含 10 个整型数据的数组)

            int *p;(定义 p 为指向整型变量的指针变量)

            p= &a[0];(把 a[0]元素的地址赋给指针变量 p。也就是使 p指向 a 数组的第0号元素)

            在定义指针变量时可以对它赋予初值: int * p=&a[0];

2.通过指针引用数组元素

如果 p 的初值为&i[0],则:

(1) p+i和 a+i 就是 a[i]的地址,或者说,它们指向 a数组的第 i个元素。

(2) * (p+i) 或* (a+i)是 p+i 或 a+i 所指向的数组元素,即 a[i]。

(3) 指向数组的指针变量也可以带下标,如 p[i]与 * (p+i) 等价。

eg:输出数组中的全部元素。

# include <stdio. h> 
void main() 
{  
    int a[lO]; 
    int i; 
    for(i=0;i<l0;i++) 
    scan£("%d", &a[i]);
    printf("\n"); 
    for(i=O;i<l0;i++) 
    printf("%d",a[i]); 
    printf("\n");
}

3.指针+整形一维数组

eg:写一个函数,打印数组每一项的值

int printfArray(int *p,int len)
{
    int i=0;
    for(i=0;i<len;++i)
    {
        printf("a[%d]=%d\n",i,*p++);
    }
}

还有另外一种写法

void printfArrayP(int *begin,int *end)//迭代
{
    while(begin<=end)
    {    
        printf("%d\n",*begin);
        ++begin;
    }
}

eg:写一个函数,找出两个数的最大值

int FindMax(int *begin,int *end)
{
    int max=0;
    while(begin<=end)
    {    
        if(*begin>max)
        max=*begin;
    }    
    ++begin;
}
return max;

//另外一种写法
int FindMaxp(int *p,int len)
{
    int max=*p;
    int i=0;
    for(i=0;i<len;++i)
    {
        if(*(p+i)>max)
        max=*(p+i);
    }
return max;
}

eg:选择排序

冒泡排序:

插入排序:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值