欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c语言笔记第一天:标识符,数据类型,sizeof和strlen区别及面试题

程序员文章站 2022-06-26 10:42:36
c语言笔记第一天:标识符,数据类型,sizeof和strlen区别及面试题。 1.所谓标识符,就是你起的一个名字。c/c++中,是你用来标识变量名、符号常量名、函数名、数组名、文...

c语言笔记第一天:标识符,数据类型,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);

//}