关于指针的一些题目(2)字符串中,sizeof和strlen函数的使用

#define _CRT_SECURE_NO_WARNINGS 1 

#include<stdio.h>
#include<string.h>
int main()
{
    /*char* p="abcdefg";
    printf("%p\n",&p+1);
    printf("%p\n",&p[0]+1);
    printf("%p\n",&p[0]);*/
    char arr[] = "abcdef";
    printf("%d\n", sizeof(arr));// 7 计算数组的大小,abcdef0。
    printf("%d\n", sizeof(arr+0));// 4/8,计算首元素地址的大小
    printf("%d\n", sizeof(*arr));// 1,计算第一个元素的大小
    printf("%d\n", sizeof(arr[1]));// 1,计算第二个元素的大小
    printf("%d\n", sizeof(&arr));// 4/8 计算数组的地址
    printf("%d\n", sizeof(&arr+1));// 4/8 计算数组地址后面的那个地址的大小
    printf("%d\n", sizeof(&arr[0]+1));// 4/8 计算第二个元素的地址的大小
    
    printf("%d\n", strlen(arr));// 6 abcdef \0不算进内容里
    printf("%d\n", strlen(arr+0));//6 abcdef
    printf("%d\n", strlen(*arr));//error(strlen里面的参数要是指针)
    printf("%d\n", strlen(arr[1]));//error(strlen里面的参数要是指针)
    printf("%d\n", strlen(&arr));//6 ,编译器可能会报错,&arr是数组的地址,应该存放到数组指针里面去,char(*p)[7]
    printf("%d\n", strlen(&arr+1));//随机值,&arr是数组的地址,应该存放到数组指针里面去,char(*p)[7]
    printf("%d\n", strlen(&arr[0]+1));//5,bcdef

    char *p = "abcdef";
    printf("%d\n", sizeof(p));// 4/8,计算指针变量p的大小
    printf("%d\n", sizeof(p+1));// 4/8,计算b的地址的大小
    printf("%d\n", sizeof(*p));// 1
    printf("%d\n", sizeof(p[0]));// 1
    printf("%d\n", sizeof(&p));// 4/8
    printf("%d\n", sizeof(&p+1));// 4/8
    printf("%d\n", sizeof(&p[0]+1));// 4/8
    printf("%d\n", strlen(p));// 6
    printf("%d\n", strlen(p+1));// 5
    printf("%d\n", strlen(*p));//error ,strlen里面的参数应该是const char *
    printf("%d\n", strlen(p[0]));//error ,strlen里面的参数应该是const char *
    printf("%d\n", strlen(&p));//随机值,p的地址往后取,直到取到0
    printf("%d\n", strlen(&p+1));//随机值,p+1的地址往后取,直到取到0
    printf("%d\n", strlen(&p[0]+1));//5 
//二维数组
    int a[3][4] = {0};
    printf("%d\n",sizeof(a));// 计算整个数组的大小,3*4*4=48
    printf("%d\n",sizeof(a[0][0]));//计算第零行第零列的元素大小 4
    printf("%d\n",sizeof(a[0]));// a[0]是第零行的数组名,sizeof(数组名),计算数组大小 16
    printf("%d\n",sizeof(a[0]+1));// 计算第零行第一列元素的地址 4/8
    printf("%d\n",sizeof(*(a[0]+1))); //计算第零行第一列元素的大小 4
    printf("%d\n",sizeof(a+1));// 计算第一行的首元素的地址 4/8
    printf("%d\n",sizeof(*(a+1)));//计算第一行数组的大小,相当于sizeof(a[1]) 16
    printf("%d\n",sizeof(&a[0]+1));// 计算第一行的首元素地址 4/8
    printf("%d\n",sizeof(*(&a[0]+1)));//计算第一行数组的大小,相当于sizeof(a[1]) 16
    printf("%d\n",sizeof(*a));//计算第零行数组的大小 16
    printf("%d\n",sizeof(a[3]));//16 ,虽然没有第四行,但是sizeof还是会继续计算,但不会去访问,从而出现报错
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值