黑马程序员——C语言基础---指针2

本文深入探讨了指针的基本概念,包括二级指针及其应用,并详细解析了一维指针数组的概念与使用方法。同时,文章还介绍了如何使用指针来引用数组元素,以及数组指针的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                                   ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------

四、二级指针介绍

1、二级指针介绍 

如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。也称为“二级指针”
通过指针访问变量称为间接访问。由于指针变量直接指向变量,所以称为“一级指针”。而 如果通过指向指针的指针变量来访问变量则构成“二级指针”。  

2、多级指针介绍 

注意:

int ***m1; 取值***m1 

int *****m2 取值*****m2

<span style="font-size:14px;">#include <stdio.h>
int main(int argc, const char * argv[]) {   
    int a = 5;    
    //定义一个指针变量
    int *p = &a;
    printf(" &a  = %p\n",&a);
    printf(" p   = %p\n",p);
    printf("---------------\n");    
    //定义一个二级指针
    // ** 的个数 等于 级数
    int **p1 = &p;
    printf(" &p  =%p\n",&p);
    printf(" p1  =%p\n",p1);   
    printf("---------------\n");
    printf("*p   =%d\n",*p);
    //p的值,a的地址
    printf("*p1  =%p\n",*p1);
    printf("**p1 =%d\n",**p1);    
    int ***p2 = &p1;
    printf("%d\n",***p2);    
    int ****p3 = &p2;
    printf("%d\n",****p3);    
    return 0;
}</span>

、数组指针

1、数组指针 

数组元素指针 

一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址 

指针变量可以指向数组元素(把某一元素的地址放到一个指针变量中) 

所谓数组元素的指针就是数组元素的地址 

可以用一个指针变量指向一个数组元素 

注意:

数组名a不代表整个数组,只代表数组首元素的地址。 “p=a;”的作用是“把a数组的首元素的地址赋给指针变量p”,而不是“把数组a各元素的值赋给 p”

六、使用指针引用数组元素 

1、使用指针引用数组元素 

在指针指向数组元素时,允许以下运算:

加一个整数(用+或+=),如p+1

减一个整数(用-或-=),如p-1

自加运算,如p++,++p

自减运算,如p--,--p

两个指针相减,如p1-p2 (只有p1和p2都指向同一数组中的元素时才有意义)  

如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同 一数组中的上一个元素。 

float a[10],float *p=a; 

假设a[0]的地址为2000,则 

p的值为2000 

p+1的值为2004 

p-1的值为1996  

注意: 

1)如果p的初值为&a[0],则p+i和a+i就是数组元素a[i]的地址,或者说,它们指向a数组 序号为i的元素  

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

3)如果指针p1和p2都指向同一数组 

结论: 引用一个数组元素,可用下面两种方法: 

(1)下标法,如a[i]形式 

(2)指针法,如*(a+i)或*(p+i)收地 

(3)a是常量(a++错误),p是变量(p++正 确)

<span style="font-size:14px;">#include <stdio.h>
int main(int argc, const char * argv[]) {
    int a[4]={1,2,3,4};
    printf("&a[0] = %p\n",&a[0]);
    printf("&a[1] = %p\n",&a[1]);
    printf("&a[2] = %p\n",&a[2]);    
    //数组指针
    int *p = a;  //p指向数组的第一个元素
    printf(" p    = %p\n",p);  //0x7fff5fbff7d0
    //p+1*sizeof(int)
    printf(" p+1  = %p\n",p+1);//== &a[1],误区:0x7fff5fbff7d1
    printf(" a+1  = %p\n",a+1);    
    //取得p+1对应的存储单元的内容
    printf(" *(p+1) = %d\n",*(p+1));
    printf(" *(a+1) = %d\n",*(a+1));    
    //使用数组指针和使用数组名的区别
    //p = p+1
    //*p++  // 1
    //p是一个指针变量,既然是一个变量,它存放的值是可以改变的
//    printf(" *p++   = %d\n",*p++); //1
//    printf(" *p = %d\n",*p);    
    //用数组指针遍历数组
    for (int i=0; i<4; i++) {
        //printf("%d\t",*p++);  //
        printf("%d\t",*(a+i));  // p一值指向数组的首地址
    }     
    //学习的误区:   数组名 a是一个常量  *(10++)
    //数组名++ 这是错误的
        //printf(" *a++   = %d\n",*a++); //错误的
        printf(" *a = %d\n",*a);  //1   
    return 0;
}</span>

                   第七讲    一维指针数组概念

1、一维指针数组 

一个数组的元素值为指针则是指针数组。 指针数组是一组有序的指针的集合。 指针数组的所有元素都必须是具有相同存储类型和 指向相同数据类型的指针变量。指针数组说明的一般形式为:  

类型说明符 *数组名[数组长度]  

其中类型说明符为指针值所指向的变量的类型。

<span style="font-size:14px;">#include <stdio.h>
int main(int argc, const char * argv[]) {   
    int a=3,b=4,c=5;
    int *pa[3]={&a,&b,&c};
    //打印的是指针数组的第一个元素得值
    printf("  &a    = %p\n",&a);
    printf("  pa[0] = %p\n",pa[0]);   
    //打印指针数组的首地址
    printf("  pa    = %p\n",pa);
    printf("  &pa[0]= %p\n",&pa[0]);   
    //访问a的值 a = 3
    printf("  *(&a)    = %d\n",*(&a));
    printf("  *(pa[0]) = %d\n",*(pa[0]));    
    //使用数组名来访问 a的值
    //*pa  == pa[0] (a的地址)
    //**pa
    printf("%d\n",**pa);    
    int a1[2][2]={1,2,3,4};
    //定义了一个指针数组 ,赋值为a1[0] 是第一行的地址
    int *pa1[2]={a1[0],a1[1]};
    printf("**pa1 = %d\n",**pa1);
    //pa1+1   &pa1[1]
    //*(pa1+1)  pa1[1]
    printf("**(pa1+1) = %d\n",**(pa1+1));   
    return 0;
}</span>

                                                              -------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值