c语言标识符,数据类型,sizeof和strlen区别及面试题

标识符,数据类型,sizeof和strlen区别及面试题

1.所谓标识符,就是你起的一个名字。c/c++中,是你用来标识变量名、符号常量名、函数名、数组名、文件名、类名、对象名等的。(就好像你父母有了你以后给你起的名字)~~ c/c++有效标识符的构成规则如下

(1)第一个字符必须是字母(不分大小写)或下划线(_);
(2)后跟字母(不分大小写)、下划线(_)或数字组成;
(3)标识符中的大小写字母有区别。如,变量sum,Sum,SUM代表三个不同的变量;
(4)不能与c编译系统已经预定义的、具有特殊用途的保留标识符(即关键字)同名。比如,不能将标识符命名为float,auto,break,case,this,try,for,while,int,char,short, unsigned,等等;
2.变量的本质是内存中的存储单元
2.c数据类型:(1)基本类型:数值类型,字符类型
(2)构造类型:数组,结构体,共用体,枚举类型
(3)指针类型
(4)空类型void
3.sizeof和strlen
sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止。
而sizeof()函数返回的是变量声明后所占的内存数。
sizeof是算符,strlen是函数。sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,
  如:
  fun(char [8])
  fun(char [])
  都等价于 fun(char *)
char str[20]="0123456789";
  int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
  int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。
  上面是对静态数组处理的结果,如果是对指针,结果就不一样了
  char* ss = "0123456789";
  sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是
  长整型的,所以是4
  sizeof(*ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的第一位'0' 所占的内存空间,是char类
  型的,占了 1 位
  strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen
  sizeof返回对象所占用的字节大小. //正确
  strlen返回字符个数. //正确
  在使用sizeof时,有一个很特别的情况,就是数组名到指针蜕变,
  char Array[3] = {'0'};
  sizeof(Array) == 3;
  char *p = Array;
  strlen(p) == 1;//sizeof(p)结果为4
  在传递一个数组名到一个函数中时,它会完全退化为一个指针
  ----------------------------------------------------------
  看完以上你是否很清楚sizeof和strlen的区别了呢?还不明白的话,我们看下面几个例子:
  第一个例子
  char* ss = "0123456789";
  sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针
  sizeof(*ss) 结果 1 ===》*ss是第一个字符
  大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度
  这就是sizeof(x)可以用来定义数组维数的原因
  char str[20]="0123456789";
  int a=strlen(str); //a=10;
  int b=sizeof(str); //而b=20;
  大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度
  这就是sizeof(x)可以用来定义数组维数的原因
  char str[20]="0123456789";
  int a=strlen(str); //a=10;
  int b=sizeof(str); //而b=20;
  char ss[] = "0123456789";
  sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1
  sizeof(*ss) 结果 1 ===》*ss是第一个字符
  char ss[100] = "0123456789";
  sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1
  strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到\0为止之前
  int ss[100] = "0123456789";
  sizeof(ss) 结果 400 ===》ss表示在内存中的大小 100×4
  strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以'\0'结尾的
  char q[]="abc";
  char p[]="a\n";
  sizeof(q),sizeof(p),strlen(q),strlen(p);
  结果是 4 3 3 2
4.面试题:
(1)
//void Test1()
//{
//    char* arr = "hello world!";
//    int len1 = sizeof(arr);    //4,地址的大小均为4字节
//    int len2 = strlen(arr);    //12,找到‘\0’,共12字节
//    printf("sizeof:%d\n", len1);
//    printf("strlen:%d\n", len2);
//}
 
//void Test2()
//{
//    char arr[20] = "hello world!";
//    int len1 = sizeof(arr);    //-->20只看类型大小
//    int len2 = strlen(arr);    //12,找到‘\0’,没有'\0'长度
//    printf("sizeof:%d\n", len1);
//    printf("strlen:%d\n", len2);
//}
 
//void Test3()
//{
//    char arr[] = "hello world!";
//    int len1 = sizeof(arr);    //13,有‘\0’长度
//    int len2 = strlen(arr);    //12,找到'\0',无‘\0’长度
//    printf("sizeof:%d\n", len1);
//    printf("strlen:%d\n", len2);
//}
 
//void Test4()
//{
//    char arr[] = { 'h', 'e', 'l', 'l', 'o' };
//    int len1 = sizeof(arr);    //5,自己判断出长度,无'\0'长度
//    int len2 = strlen(arr);    //随机值,找不到'\0'
//    printf("sizeof:%d\n", len1);
//    printf("strlen:%d\n", len2);
//}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值