指针总结

有趣的指针

c语言中指针的问题可谓是很有意思,今天就我所看的指针类的问题做一个简单的总结。

1.指针的定义和使用:

c语言中的指针是专门用来从存放内存地址的变量,每个指针都有与之相关的数据类型,我们定义的一般形式

char   *ch;
int    *a;
double *pd = NULL;

每一个指针变量存放的是内存的地址

int    a = 1;
int    *p = &a;

2. 指针和数组

(1)在c中,数组名是实际就是指向数组第一个元素的指针

int    a[] = {2,4,6,8,10};
int    *p = a;//数组首元素的地址赋值方法一
int    *q = &a[0];//数组首元素的地址赋值方法二

(2)当然这里面还有指针数组和二级指针

int     a[5] = {1,3,5,7,9};
int     *b[5],i;
int      **c = b;

那么由于 “[ ]” 的优先级高于 “*” ,所以此刻 *b[5]等价于 *(b[5])。

for(i = 0;i < 5;i++)
b[i] = &a[i];

或者可以

int *p = a;
for(i = 0;i < 5;i++)
      b[i] = p++;

此时赋值时将a这个数组的元素的地址挨个赋值给b数组

接下来是二级指针,也就是存放了内存地址的地址(类似套娃)。

int   **c = b;

这里便将b的首元素的地址赋值给了c 。

for(i = 0;i < 5;i++,c++)
printf("%d ",**c);

然后输出数据。

(3)指针数组

int    q[2][3];

首先我们知道二维数组的一维是存放着二维的地址,那么我们可以定义:

int   *p[2];

由于优先级的关系,p先和“[ ]”结合再和“*”结合,所以它是一个指向数组的指针.可以根据相对等量的赋值关系来理解

for(int i = 0;i < 2;i++){
p[i] = q[i];
}

(4)数组指针

其一般定义为:

int    (*p)[4];

对于它的理解我觉得与二维数组很像,p内存放着四个连续一维数组的首地址.

int    a[2][3]={1,2,3,4,5,6};
int    (*p)[3];
        p = a;
        p++;//a[1][];
        for(int i=0;i<3;i++){
        printf("%d ",(*p)[i]);
        }

结果为 4 5 6

3. 指针和函数:

(1)指针类型变量也可作为函数的参数

void func(int *a,int *b){
...
}

(2)最有意思的是指针也可指向函数,称之为函数指针。
一般定义为:

int (*p)(int,int);

例如以下例子:

int get_max(int i,int j){
    return i>j?i:j;
}
int get_min(int i,int j){
    return i > j?j : i;
}
int compare(int i,int j,int flag){
    int ret;
    int (*p)(int,int);//函数的指针,该函数的返回值为int型
    if(flag == GET_MAX)
    p = get_max;//函数名的赋予
    else
    p = get_min;//函数名的赋予
    ret = p(i,j);//接收返回值
    return ret;
}

而这里需要区别一下

int   *p(int i,int j);//返回指针的函数
int   (*p)(int i,int j);//定义了一个指向函数的指针

(3)函数指针作形参

int get_big(int i,int j){
return i > j?i : j;
}

int get_max(int i,int j,int k,int (*p))(int,int)){
int ret;
ret = p(i,j);
ret = p(ret,k);
return ret;
}

int main(void){
int i = 5,j = 10,k = 15,ret;
ret = get_max(i,j,k,get_big);//将该函数作为参数传入
printf("%d",ret);
return 0;
}

4. 字符串与指针

与数组指针

char ch[] = "hello world";
printf("%s",ch);
char *p = "hello world";//定义一个字符串指针
printf("%s",p);

字符串的指针可用来实现字符串数组的拷贝,可以利用这个例子来理解。

char a[] = "hello world";
char b[20],c[20];
char *p1 = a,*p2 = c;

for(int i=0;i<sizeof(a);i++)
b[i]=a[i];
while(*p1 != '\0') *(p2++)=*(p1++);

printf("%s\n",a);
printf("%s\n",b);
printf("%s\n",c);

结果当然都相同

以上就是我对于指针的一些总结,感谢你的浏览,希望可以提出宝贵的意见。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值