IT行业干货大全程序员首页投稿(暂停使用,暂停投稿)

C语言指针

2016-02-09  本文已影响1789人  Izzieo_O

学了好久的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.使用指针处理数组元素

//计算整型数组所有元素和
for (i = 0; i < 10; i++)
    {
        scanf("%d", &a[i]);
        sum += a[i];
    }
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);
    }
上一篇下一篇

猜你喜欢

热点阅读