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

来源:互联网 发布:雅马哈网络经销商查询 编辑:程序博客网 时间:2024/05/29 18:47

指针的小结
指针是存放地址才出现的,地址是为了表示一块儿空间的。
指针让地址有效地方存放,指针让内存的访问更加方便。
指针的大小在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;}

这里写图片描述

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 奶猫半夜不睡觉怎么办 龙猫不喜欢吃草粒怎么办 龙猫一直在发抖怎么办 龙猫牙齿掉了怎么办 龙猫晚上很吵怎么办 小狗把手咬破了怎么办 夏天仓鼠太热了怎么办 仓鼠玩转轮会摔怎么办 如何发截图不会发现吐怎么办 嘴巴烂了药过敏怎么办 非法校车被扣了怎么办 手指削掉一块肉怎么办 在广州误走brt道怎么办 平安eq测试没过怎么办 物业在小区私自建房怎么办 婚后父母出钱买房离婚怎么办 情人忙工作没时间约会怎么办 情人很忙不主动联系我怎么办 丈夫毫不关心基督徒妻子怎么办 眼睛太小怎么办不整容 被野生猴子咬了怎么办 被野猴子抓伤了怎么办 孩子入学前疫苗补不全怎么办 额头肤色比脸黑怎么办 高跟鞋小了挤脚怎么办 老板欠工人工资不给怎么办 小孩吃了生豆子怎么办 拍夜晚的天空太亮怎么办 购房发票字体不清晰怎么办 接到客人电话预定时怎么办 产检资料弄丢了怎么办 工作中同事喜欢争风头怎么办 想出卖身体赚钱了怎么办 孩子生下来不想要了怎么办 舌头被铁管冻住怎么办 人被水泥冻住了怎么办 姑娘果孕妇吃了怎么办 纹身后吃了辣的怎么办 怀孕五个多月不想要了怎么办 失业后又干保安档案怎么办 前列大腺脓肿要怎么办