C语言指针

作者: Izzieo_O | 来源:发表于2016-02-09 14:52 被阅读1789次

学了好久的C语言,还是在入门的初级阶段,再回头看看指针部分,一点笔记分享。(第一次写文,顺便试试Markdown)

指针运算符

//为指针变量赋初值
int x=5,*p;
p=&x;

指针与函数

1.指针作为函数参数

//指针作为函数参数,进行数值交换
void change(int *p, int *q){
    int temp;
    temp = *p;
    *p = *q;
    *q = temp;
}
void main(){
    int x = 3, y = 5;
    change(&x, &y);  //x,y地址作为实参传递给函数
    printf("Chnaged:x=%d,   y=%d",x,y);
}

2.指针作为返回值

//返回较大值
int* max(int *p, int *q){
    if (*p>*p)
    {
        return p;
    }else
    {
        return q;
    }
}
void main(){
    int *pointer, x, y;
    x = 3;
    y = 5;
    pointer = max(&x, &y);
    printf("%d\n", *pointer);
}

3.指向函数的指针

每个函数在编译时都会分配一个入口地址,该地址是该函数中第一条指令的地址,即函数的指针。

//计算两数之和应用
int sum(int x, int y){
    int z;
    z = x + y;
    return z;
}
void main(){
    int (*p)(int ,int );    //定义指向函数的指针变量
    int a, b, c;
    p = sum;    //sum 函数的入口地址赋给指针变量p
    scanf("%d %d", &a, &b);
    c = (*p)( a,b); //用指向函数的指针变量调用函数
    printf("a=%d,b=%d,sum=%d", a, b, c);
}

4.指向函数的指针作为函数参数

//求两数之和、差
//原本可以直接调用sum()、sub(),却将其地址作为参数传递给operate()。因为用指向函数的指针变量作为参数可以每次根据实际
//情况传递不同的函数入口地址给operate(),而无需修改该函数。利于程序的重用。
void operate(int x,int y,int (*funC)(int,int)){
    int result;
    result = (*funC)(x, y);
    printf("%d\n", result);
}
int sum(int x, int y){
    return x + y;
}
int sub(int x, int y){
    return x - y;
}
void main(){
    int x, y;
    printf("please input x and y:");
    scanf("%d,%d", &x, &y);
    printf("sum=");
    operate(x, y, sum); //sum函数的入口地址传给operate
    printf("sub=");
    operate(x, y, sub);
}

指针与数组

C语言规定数组名代表数组中的一个元素地址,即0号元素地址。(以下等价)

p=&a[0];
p=a;//a数组的首元素赋给指针变量p

1.指针运算

1.1指针加(减)一个整数

指针加上整数i仍是一个指针,该指针指向数组中的某个特定元素,元素位于p指向的元素后面的第i个位置的元素。
因为a代表数组的首地址,因此,a+i也代表a[i]地址。
如果每个数组元素占用多个内存单元,如int型占用两个内存单元,float型占用四个内存单元,那么每次执行p+1代表的地址实际上是p+i*l,l表示一个数组元素所占有的内存单元数(字节数)。假设a数组为int 型数组,如果p中存放地址是3000,那么p+1指向的是3002。

1.2.指针相减

只有当指针指向数组元素时,指针上进行的算术运算才能得到有意义的结果
只有两个指针都指向同一个数组,指针相减才有意义
两个地址不能相加

2.使用指针处理数组元素

  • 1.下标法
    使用下标引用数组元素
//计算整型数组所有元素和
for (i = 0; i < 10; i++)
    {
        scanf("%d", &a[i]);
        sum += a[i];
    }
  • 2.指针法
    使用数组名或使用数组元素的指针引用数组
for ( i = 0; i < 10; i++)
    {
        scanf("%d", a + i);     //使用数组名引用数组元素   a+i等价于&a[i]
        sum += *(a + i);    //*(a + i)表示a[i]的值
    }
//使用指针变量直接指向数组元素,不需要每次都重新计算数组元素的地址,相比前两种执行速度更快
    for (  p=a;  p<a+10; p++)//通过指针变量不断自增
    {
        scanf("%d", p);
        sum += *p;
    }

3.指针数组

一个数组的元素都是指针类型的数据
指针数组并不常用,更适合用来指向多个字符串。,进行字符串的处理。

4.指向指针数据的指针

int **p;//定义指向指针的指针变量
char *color[] = { "red", "yellow", "blue", "black", "green", "white" };//C语言中,字符串通过字符数组存储
    char **p;   //定义指向指针数据的指针变量
    for (int i = 0; i < 5; i++)
    {
        p = color + i;      //p是指向指针的指针变量,依次指向5个字符串
        printf("%s\n", *p);
    }

相关文章

  • C语言05- 指针

    C语言05- 指针 13:指针 指针是C语言中的精华,也是C语言程序的重点和难点。 13.1:指针定义与使用 指针...

  • 02-C语言的指针

    02-C语言的指针 目标 C语言指针释义 指针用法 指针与数组 指针与函数的参数 二级指针 函数指针 指针在C中很...

  • C语言指针总结大学霸IT达人

    C语言指针总结大学霸IT达人 C语言的指针是C语言区别其它语言的最主要的特定之一。有了指针,C语言就可以抛开所有束...

  • 带小白学C语言指针

    C语言里指针才是C语言的开始和指针;C语言里基本所有东西都是由指针演变而成; 指针是指向地址的变量,类型就是指针...

  • 在Swift中使用C语言的指针

    在Swift中使用C语言的指针 在Swift中使用C语言的指针

  • [Swift]结构体指针操作

    C语言的指针操作 在c语言中申明一个变量并通过指针修改该变量的值 a value is 2 c语言操作结构体指针操...

  • Go语言-指针

    Go语言中的指针不同于C语言,Go语言的指针使用方法要简单很多。当然和C语言从指针定义到指针的使用都有很大的不同。...

  • C语言中的指针与数组

    C语言中的指针与数组 @(C语言)[排序算法, 快速排序, C实现] 引言 相信指针与数组是不少同学在初学C语言时...

  • 指针数组和数组指针

    指针数组|存储指针的数组 在C语言和C++语言中,数组元素全为指针的数组称为指针数组。 例如:int *p[10]...

  • iOS开发 -- C语言基础8(指针)

    iOS开发 -- C语言基础8(指针) 指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很...

网友评论

  • 一念路向北:不知道当初自己过的,现在一点都看不懂。
  • 梁生在此:觉得c最难学就是指针了。
  • 雾花花:谢谢
  • dc47dc942f13:之前学过几个入门的函数,全忘光了,最近打算继续学:disappointed_relieved:
  • 萌妹子1990:熟悉又陌生的c语音,学到数组就彻底放弃了。
    萌妹子1990:@Izzieo_O 可是好难,我确实学不懂
    Izzieo_O:@萌妹子1990 指针可是C的精华
  • 栀子Vanyong:还木有搞清楚:confounded::confounded:
    Izzieo_O:@栀子Vcn 加油,我学了好久还是不清楚😭
  • 任雪纷飞:受用!~
  • 木子不语_:个别地方有错误
    木子不语_:@Izzieo_O 2.指针作为返回值

    //返回较大值
    int* max(int *p, int *q){
    if (*p>*p) //应该是*p>*q吧
    {
    return p;
    }else
    {
    return q;
    }
    }
    Izzieo_O:@木子不语_ 哪里😔指出咯…第一次发文😊
  • 65f9370eaa13:c的精华就在指针了
  • Kanting:我问个题,指针函数哪里一直有疑惑,如果指针q获得函数地址,(*q)()表示指针函数,那*(q)()和*q()对比有什么区别,这样形式合法吗
    kophy:@Kanting 使用函数指针时两者是一样的,比如:

    int foo(int i) {
    return i + 1;
    }
    int (*f)(int) = foo;

    那么使用f(2)和(*f)(2)都可以,因为f和*f的值都是函数foo的入口地址,这只是个语法糖
  • kophy:返回较大值的max函数里if条件写错了(*p > *p)
    另外可以考虑用更简单的形式 return (*p) > (*q)? p : q;

本文标题:C语言指针

本文链接:https://www.haomeiwen.com/subject/bhmykttx.html