指针小聊

来源:互联网 发布:java 异步io 框架 编辑:程序博客网 时间:2024/05/16 13:44

复习指针和数组相关运算

    一维数组    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));       //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));        //随机值    遇到\0才停下来    printf("%d\n", strlen(arr+0));      //随机值         printf("%d\n", strlen(*arr));       //err      a的ASCII码97 不允许访问    printf("%d\n", strlen(arr[1]));     //err        b    printf("%d\n", strlen(&arr));       //随机值    printf("%d\n", strlen(&arr+1));     //随机值    printf("%d\n", strlen(&arr[0]+1));  //随机值   *char *p = "abcdef";   printf("%d\n", sizeof(p));           //4       字符a的地址       printf("%d\n", sizeof(p+1));         //4       字符b的地址   printf("%d\n", sizeof(*p));          //1       p是字符指针,对p解引用可以访问一个字节   printf("%d\n", sizeof(p[0]));        //1        p[0]==*(p+0) 第一个元素   printf("%d\n", sizeof(&p));          //4   printf("%d\n", sizeof(&p+1));        //4   printf("%d\n", sizeof(&p[0]+1));     //4       b的地址   printf("%d\n", strlen(p));           //6    printf("%d\n", strlen(p+1));         //5       p+1为b的地址   printf("%d\n", strlen(*p));          //err   printf("%d\n", strlen(p[0]));        //err   printf("%d\n", strlen(&p));          //随机值   printf("%d\n", strlen(&p+1));        //随机值   二维数组   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    第一行第二个元素   printf("%d\n", sizeof(a+1));         //4    第二行地址   printf("%d\n", sizeof(&a[0]+1));     //4    第二行地址   a[0]为第一行数组名   printf("%d\n", sizeof(*a));          //16   第一行的地址解引用  假想为一唯数组 第一行的大小   printf("%d\n", sizeof(a[3]));        //16   sizeof内部的表达式不参与运算  第四行数组名虽不存在但不影响计算 因为不会放入

一级指针

#include <stdio.h>int main(){    int a = 10;     int *p = &a;     printf("%p\n",p);    return 0;}

此处p为一个一级指针,p中存储的是变量a的地址
这里写图片描述
由此可见,指针就是变量, 用来存放地址的变量。
二级指针

int main(){    int a=10;    int *pa=&a;    int **ppa=&pa;    printf("%p\n",a);    printf("%p\n",pa);    return 0;}

指针类型
通过指针引用一个变量,必须知道该数据的类型,才能按存储单元的长度以及数据的存储形式正确的取出该数据。即在定义指针变量时必须指定基类型。
这里写图片描述
指针表达式解析
一般左值代表空间,右值代表内容,左值不一定能够放在等号左边
这里写图片描述

&ch;     //不能放在等号左边,能放在等号右边cp;      //能放在等号左边,能放在等号右边&cp;     //不能放在等号左边,能放在等号右边(表示cp的地址)*cp+1;   //不能放在等号左边(常量不能被赋值),放在等号右边相当于字符b*(cp+1) ;//表示a后面的空间,能放在等号左边++cp;    //在c语言中,一个变量进行前置加加或者后置加加都不能放在等号左边cp++;  *++cp;  //和表达式*(cp+1)效果一样*cp++;  //能放到等号左边,能放到等号右边++*cp;  //能放到等号右边,相当于字符b(*cp) ++;//能放到等号右边,相当于字符a,但此时ch指向b++*++cp; //表示ch下一块地址的东西自增

指针数组
指针数组是数组, 是一个存放指针的数组。
eg:

int *arr1[10];char *arr2[4];char **arr3[5];

数组指针
eg:int (*p)[10];
p先和*结合, 说明p是一个指针变量, 然后指着指向的是一个大小为10个整型的数组。 所以p是一个指针, 指向一个数组, 叫数组指针。
函数指针

void(*P)(int char)=test1;void(*P)(int char)=test1;//函数指针void(*parr[3])(int char)=(test1,test2,test3);//函数指针的数组void(*(*ptr[3])(int char)=&arr;//指向函数指针的指针
#include<stdio.h>int ADD(int a,int b){    return(a+b);}int main(){    int (*p)(int,int)=ADD;//定义一个返回值类型为整形,有两个参数,且参数为整形的函数指针*p    printf("%d\n",p(1,3));//通过函数指针来访问其所指向的函数Add    return 0;}
原创粉丝点击