c基础 指针2

指针 

1.二级指针

一级指针:存放普通变量的地址

二级指针:存放一级指针的地址

1.1格式

存储类型 数据类型 **变量名

 p指向了a,q指向了p也就是p的地址

a的值

a的地址p的地址
a&a&p
*ppq
**q*q

2.指针和数组 

2.1两种访问方式

直接访问:按变量的地址存取变量的值(通过数组名访问)

简介访问:通过存放变量地址的指针访问(通过指针访问)

2.2指针和一维数组

int a[5]={1,2,3,4,5};

int *p=a;

通过数组名直接访问

元素:a[i]    *(a+i)

地址:&a[i]    a+i

通过指针间接访问

元素: p[i]    *(p+i)

地址:&p[i]    p+i

2.3++*运算方法

++*单目运算符

单目运算符从右向左运算

++在前++取值++取值加加

++结合内容内容加加++结合指针那么指针加加

2.4指针和二维数组

例如

int a[2][3] = {1,2,3,4,5,6};

a数组名表示第一行地址a+1表示第二行地址

在行地址前面加*表示将行地址降级为列地址。

*a: 表示第一行第一列的地址

*a+1 表示第一行第二列地址

*(a+1): 表示二行第一列地址

*(a+1)+1: 表示第二行第二列地址

元素:a[i][j]    *(a[i]+j)      *(*(a+i)+j)

地址:&a[i][j]   a[i]+j         *(a+i)+j

3.数组指针

3.1定义

本质还是指针,指向的是数组(又称行指针)

3.2格式

存储类型 数据类型 (* 指针变量名)[列数];

例如

int a[2][3] = {1,2,3,4,5,6}; //a类型int (*)[3]

int (*p)[3] = a;

p的类型也是 int (*)[3], 运算33运算

p可以代替a进行元素访问但是本质不同p指针变量a地址常量

访问地址

&p[i][j]

p[i]+j

*(p+i)+j

访问元素

p[i][j]

*(p[i]+j)

*(*(p+i)+j)

练习:

有一个班,3个学生,各学4门课,计算总平均分以及输出第n个学生的成绩。

int a[3][4] = {65,55,23,57,52,67,64,80,90,42,75,92};

#include <stdio.h>
int main()
{
    int a[3][4] = {65, 55, 23, 57, 52, 67, 64, 80, 90, 42, 75, 92};
    int(*p)[4] = a;
    int sum = 0;
    int n;
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            sum = sum + p[i][j];
        }
    }
    printf("%d \n", sum / 12);
    scanf("%d", &n);
    if (n <= 3)
    {
        for (int i = 0; i < 4; i++)
        {
            printf("%d ", p[n - 1][i]);
        }
    }
    else
        printf("gun");
    printf("\n");
}

3.3大小

sizeof(p) = 8

因为本质还是指针所以大小都是8字节 如果32系统4字节

4.指针数组

4.1定义

所谓指针数组是指由若干个具有相同存储类型和数据类型的指针变量构成的集合。

其本质是数组,里面存放的是指针。

4.2定义格式

存储类型 数据类型 *数组名[元素个数];

指针数组名还是表示该数组的首地址

4.3应用

用于存放普通变量的地址

例如

int a=10,b=20,c=30;

int *p[3] = {&a,&b,&c};

访问b的值

*p[1]       **(p+1)

访问b的地址

p[1]        *(p+1)

访问abc的值

*p[i]     **(p+i)

访问abc的地址

p[i]     *(p+i)

用于存放二维数组中每行的一列的地址(列地址)

例:

int a[2][3]={1,2,3,4,5,6}

int *p[2]={a[0],a[1]};

访问地址

&p[i][j]

p[i]+j

//例如:p[0]=a[0]=&a[0][0]

//再例如:p[1]+1: p[1]=a[1]=&a[1][0] ==>p[1]+1 = &a[1][1]

*(p+i)+j

//例如:*(p+1)+1: p+1 = &p[1] ==>*(p+1)=p[1]=a[1]=&a[1][0] ==>*(p+1)+1 =&a[1][1]

访问元素

p[i][j]

*(p[i]+j)

*(*(p+i)+j)

用于存放字符串

char *p[3] = {"hello", "world","666"};

#include <stdio.h>
int main()
{
    char *p[3]={"hello","world","666"};
    printf("%s %s\n",p[1],*(p+1));
    printf("%s %s\n",p[0],*(p));
    printf("%c %c\n",*(p[0]+1),*(*(p)+1));
    printf("%c %c\n",*(p[1]+4),*(*(p+1)+4));
}
命令行参数

int main(int argc, char const *argv[])

{

printf("%s\n",argv[0]);

}

argv:就是一个指针数组,里面存放的是命令行传递的字符串

argc:表示argv指针数组里面存储数据的个数,即命令行传递字符串的个数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值