指针与数组的基础知识分析

指针的小结
指针是存放地址才出现的,地址是为了表示一块儿空间的。
指针让地址有效地方存放,指针让内存的访问更加方便。
指针的大小在32位平台上是4个字节,在64位平台上是8个字节。

int main()
{
    int a = 10;//在内存中开辟一块儿空间
    int *p = &a;//在这里我们对变量a,取出它的地址,可以使用&操作符。
                //将a的地址存放在p变量中,p就是一个指针变量。
    system("puase");
    return 0;
}
//总结:指针就是变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。

指针的创建 type + *
当不知道给指针初始化什么值的时候,一定要记得赋空指针,如:char* pc = NULL;
指针和指针的类型

int main()
{
    int a = 10;
    char c = 'w';
    double d = 3.14;
    //创建不同类型的指针
    int* pa = &a;
    char* pc = &c;
    double* pd = &d;

    printf("%d\n", sizeof(char));//1
    printf("%d\n", sizeof(short));//2
    printf("%d\n", sizeof(int));//4
    printf("%d\n", sizeof(float));//4
    printf("%d\n", sizeof(double));//8
    printf("%d\n", sizeof(long));//4/8
    printf("%d\n", sizeof(long long));//8

    printf("%d\n", sizeof(char*));//4
    printf("%d\n", sizeof(short*));//4
    printf("%d\n", sizeof(int*));//4
    printf("%d\n", sizeof(float*));//4
    printf("%d\n", sizeof(double));//4
    printf("%d\n", sizeof(long*));//4
    printf("%d\n", sizeof(long long*));//4
    system("puase");
    return 0;
}

一级指针

int main()
{
    char* p = "abcdef";
    printf("%d\n", sizeof(p));//4
    printf("%d\n", sizeof(p+1));//4
    printf("%d\n", sizeof(*p));//1
    printf("%d\n", sizeof(p[0]));//1
    printf("%d\n", sizeof(&p));//4
    printf("%d\n", sizeof(&p+1));//4
    printf("%d\n", sizeof(&p[0]+1));//4

    printf("%d\n", strlen(p));//6
    printf("%d\n", strlen(p + 1));//5
    printf("%d\n", strlen(*p));//err
    printf("%d\n", strlen(p[0]));//err
    printf("%d\n", strlen(&p));//随机值
    printf("%d\n", strlen(&p + 1));//随机值
    printf("%d\n", strlen(&p[0] + 1));//5
    system("pause");
    return 0;
}

类型不同的影响

1:整型指针
int main()
{

    int a = 0x11223344;
    int *pa = &a;
    *pa = 0;
    system("pause");
    return 0;
}

这里写图片描述

这里写图片描述

2:字符指针
int main()
{

    int a = 0x11223344;
    char *pa = &a;
    *pa = 0;
    system("pause");
    return 0;
}

这里写图片描述

这里写图片描述
由例1、例2得出:指针类型决定了指针有多大权限去访问空间
这里写图片描述
例3:指针+-整数。
这里写图片描述
由例3得出:指针类型决定指针的步长(指针+i加的是i*sizeof(指针所指向元素的类型)),int*走一步走四个字节,char*走一步走一个字节

指针-指针
int main()
{
    int arr[10] = { 0 };
    int* p = &arr;
    printf("%d\n", &arr[9]-&arr[0]);//9
    printf("%d\n",(p+9)-p );//9
    system("pause");
    return 0;
}//指针-指针=指针之间元素的个数,这两个指针必须在同一个范围

二级指针
这里写图片描述

一维数组

int main()
{
    //整型数组
    int a[] = { 1, 2, 3, 4 };
    printf("%d\n", sizeof(a));//16  
    printf("%d\n", sizeof(a + 0));//4  
    printf("%d\n", sizeof(*a));//4  
    printf("%d\n", sizeof(a + 1));//4  
    printf("%d\n", sizeof(a[1]));//4  
    printf("%d\n", sizeof(&a));//4  
    printf("%d\n", sizeof(&a + 1));//4  
    printf("%d\n", sizeof(&a[0]));//4  
    printf("%d\n", sizeof(&a[0] + 1));//4  

    //字符数组  
    char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
    printf("%d\n", sizeof(arr));//6  
    printf("%d\n", sizeof(arr + 0));//4  
    printf("%d\n", sizeof(*arr));//1  
    printf("%d\n", sizeof(arr[1]));//1  
    printf("%d\n", sizeof(&arr));//4  
    printf("%d\n", sizeof(&arr + 1));//4  
    printf("%d\n", sizeof(&arr[0] + 1));//4  

    printf("%d\n", strlen(arr));//随机值  
    printf("%d\n", strlen(arr + 0));//随机值  
    printf("%d\n", strlen(*arr));//无法运行  
    printf("%d\n", strlen(arr[1]));//无法运行  
    printf("%d\n", strlen(&arr));//随机值  
    printf("%d\n", strlen(&arr + 1));//随机值  
    printf("%d\n", strlen(&arr[0] + 1));//随机值  
    system("pause");
    return 0;
}

二维数组

int main()
{
    int a[3][4] = { 0 };
    printf("%d\n", sizeof(a));//48  
    printf("%d\n", sizeof(a[0][0]));//4  
    printf("%d\n", sizeof(a[0]));//16,表示的是二维数组的第一行  
    printf("%d\n", sizeof(a[0] + 1));//4,表示的是a[0][1]  
    printf("%d\n", sizeof(a + 1));//4,表示第二行的地址  
    printf("%d\n", sizeof(&a[0] + 1));//4,表示第二行的地址  
    printf("%d\n", sizeof(*a));//16,表示对第一行的所有值进行解引用  
    printf("%d\n", sizeof(a[3]));//16,其表达式等价于a[0],即表示二维数组的一行  
    system("pause");
    return 0;
}

指针数组
每个元素都是指针

例:
int main()
{
    int a = 10;
    int b = 20;
    int* arr[2] = { &a, &b };//可存放a与b的地址
    char* arr2[3] = { "zhangsan", "lisi", "wangwu" };//存入的是每个字符串首元素的地址
    int i = 0;
    int j = 0;
    for (j = 0; j < 2; j++)
    {
        printf("%d ", *arr[j]);
    }
    printf("\n");
    for (i = 0; i < 3;i++)
    {
        printf("%s ", arr2[i]);
    }
    system("pause");
    return 0;
}

这里写图片描述

数组指针
指向数组的指针

int main()
{
    int arr[10];
    int *parr = arr;
    int(*ptr)[10] = &arr;// int(* )[10]类型
    //能够指向大小为10个整型的数组指针
    char* arr2[10];
    char* (*p)[10] = &arr2;
    //能够指向大小为10个char*型的数组指针
    system("pause");
    return 0;
}
例:
void print(int(*arr)[4], int x, int y)
{
    int i = 0;
    for (i = 0; i < x;i++)
    {
        int j = 0;
        for (j = 0; j < y;j++)
        {
            //printf("%d ",arr[i][j];
            printf("%d ", *(*(arr + i) + j));
        }
    }
}
int main()
{
    int arr[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    print(arr, 3, 4);
    system("pause");
    return 0;
}

定义成数组,申明成指针
这里写图片描述
定义成指针,申明成数组
这里写图片描述

数组传参

例:
//void test(int arr[3][4][5])
//void test(int arr[ ][4][5])
void test(int (*p)[4][5])
{

}
int main()
{
    int arr[3][4][5];
    test(arr);
    system("pause");
    return 0;
}

一级指针传参

例:
void print(int *p, int sz)
{
    int i = 0;
    for (i = 0; i < sz;i++)
    {
        printf("%d\n", *(p + i));
    }
}
int main()
{
    int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    int *p = arr;
    int sz = sizeof(arr) / sizeof(arr[0]);
    print(p, sz);//一级指针p,传给参数
    system("pause");
    return 0;
}

这里写图片描述

小结:
void test(int *p)
{

}
int main()
{
    //一级指针可以传的参数
    int arr[10];
    int *ptr = NULL;
    int a = 10;
    test(arr);
    test(ptr);
    test(&a);
    system("pause");
    return 0;
}

二级指针传参

void test(int **p)
{

}
int main()
{
    //二级指针可以传的参数
    int* arr[10];
    int *ptr = NULL;
    int **a = 10;
    test(arr);
    test(&ptr);
    test(a);
    system("pause");
    return 0;
}

函数指针

例:
void test()
{
    printf("hehe\n");
}
int main()
{
    printf("%p\n", &test);
    printf("%p\n", test);
    (*&test)();//这里的*不起任何作用,(&test)();
    (*test)();//这里的*不起任何作用,(test)();
    test();
    system("pause");
    return 0;
}

这里写图片描述

例:
void test(const char* str)
{
    printf("%s\n", str);
}
int main()
{
    //void *p1(const char*);
    void(*p2)(const char*);//p2为一个函数指针变量

    p2 = &test;
    p2("hehe");
    system("pause");
    return 0;
}

这里写图片描述

例:
int Add(int a, int b)
{
    return a + b;
}

int main()
{
    int(*p)(int, int) = Add;//将Add函数的地址存在一个函数指针里
    printf("%d\n", p(1, 2));//调用并输出
    system("pause");
    return 0;
}

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值