c语言--关于数组与指针的一些基本运算

一.sizeof()的有关运算

1.知识:
  • 当数组名a单独放在sizeof()内部(即 sizeof(a))时,a表示整个数组;当数组名a单独放在&后面时(即&a),a表示整个数组;
  • 余的a都表示数组a首元素的地址;&a,表示数组a的地址,其实是a首元素的地址,一个整形大小为4个字节,一个字符型大小为1个字节
2.相关计算
include<stdio.h>
int main()
{
    int a[] = {1,2,3,4};
    printf("%d\n",sizeof(a));    //整个数组的大小                 16
    printf("%d\n",sizeof(a+0));   //首元素的地址加0,还是首元素的地址           4
    printf("%d\n",sizeof(*a));  //数组a首元素的大小                4
    printf("%d\n",sizeof(a+1));  //数组a首元素的地址加1,表示数组第二个元素的地址的大小,地址为4个字节     4
    printf("%d\n",sizeof(a[1]));   //数组a第二个元素的大小              4
    printf("%d\n",sizeof(&a));   //数组a首元素地址的大小                4
    printf("%d\n",sizeof(&a+1));   //数组a下一个数组(其他)的地址大小  4
    printf("%d\n",sizeof(&a[0]));  //数组a首元素地址的大小             4
    printf("%d\n",sizeof(&a[0]+1));  //数组a第二个元素的地址的大小     4
    return 0;
}


//字符数组
#include<stdio.h>
int main()
{
	char arr[] = {'a','b','c','d','e','f'};  //arr[]表示一个字符数组,里面有6个元素,不包括\0,一个char类型大小为1个字节
        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]));  //数组第二个元素'b' 的大小   1
        printf("%d\n", sizeof(&arr));  //数组首元素的地址            4
        printf("%d\n", sizeof(&arr+1));  //跳过整个数组,后面内容的地址的大小  4
        printf("%d\n", sizeof(&arr[0]+1));   //数组第二个元素的地址的大小   4
	
	return 0;
}

二.strlen()的有关运算

1.strlen()用来计算指定字符串的长度,不包括结束字符“\0”;它会从首地址一直找下去,直到遇到"\0"停止。
2.相关计算:
#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = {'a','b','c','d','e','f'};
	printf("%d\n", strlen(arr));
	//从数组的首元素地址一直找下去,直到"\0"停止,该数组不包括"\0",所以它会一直找下去,计算结果为一随机数
    printf("%d\n", strlen(arr+0));
	//从数组的首元素地址一直找下去,计算结果为一随机数
    printf("%d\n", strlen(*arr));
	//*arr表示首元素,即'a',也就是从地址值为97开始找,但97是一个未知地址,不允许访问,所以这题是错误的
    printf("%d\n", strlen(arr[1]));
	//arr[1],即'b',所以这题也是错误的
    printf("%d\n", strlen(&arr));
	//从数组的首地址一直找下去,计算结果为一随机数
    printf("%d\n", strlen(&arr+1));
	//从跳过这个数组的地址开始找下去,计算结果为一随机数,比上式大6
    printf("%d\n", strlen(&arr[0]+1));
   //从数组的第二个元素的地址一直找下去,计算结果为一随机数,比上式小5

	
	return 0;
}

2.
#include<stdio.h>
#include<string.h>
int main()
{
	char *p = "abcdef";//*p 表示字符类型的指针变量p
    printf("%d\n", sizeof(p));//p存放首元素a的地址,则结果为4
    printf("%d\n", sizeof(p+1));//p+1存放b的地址,结果为4
    printf("%d\n", sizeof(*p));//*p表示首元素,结果为1
    printf("%d\n", sizeof(p[0]));//表示首元素,结果为1
    printf("%d\n", sizeof(&p));//字符类型的指针变量p的地址大小,结果为4
    printf("%d\n", sizeof(&p+1));//指向下一个地址,仍然是地址,结果为4
    printf("%d\n", sizeof(&p[0]+1));//b的地址,结果为4

    printf("%d\n", strlen(p));//从a的地址一直找,直到遇到"\0"结束,结果为6
    printf("%d\n", strlen(p+1));//从b的地址一直找,直到遇到"\0"结束,结果为6
    printf("%d\n", strlen(*p));//错误,*p表示首元素,即'a',也就是从地址值为97开始找,但97是一个未知地址,不允许访问,所以这题是错误的
    printf("%d\n", strlen(p[0]));//错误,与上式一样
   
	return 0;
}





 

 
 
 
 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值