记录看到过的c基础题目:
#include<iostream> #include<string.h> using namespace std; void arraysize(char arr[]){ printf("the size of arr[] is %d\n", sizeof(arr)); } int main(void){ char tmp[20] = "I love you"; char *str = "I love you"; char* p = tmp; printf("The size of char* is %d\n", sizeof(char *)); arraysize(tmp); printf("The size of char* p=tmp is %d\n", sizeof(p)); printf("The size of char array tmp is %d\n", sizeof(tmp)); printf("strlen of tmp : %d\n", strlen(tmp)); printf("strlen of str %d\n", strlen(str)); return 0; }
数组名在赋值和函数参数传递中不能将数组类型传递给赋值的指针变量和函数参数,而蜕变成单纯的指针。对于p=tmp,指针p就没有数组的“内涵",仅仅是个char的指针而已。同样地,数组当作函数参数传入时,传入的只是一个指针值,也不具备数组”内涵“了。
在我计算机中运行的结果是8 8 8 20 10 10。说明在我电脑(64位)上char指针大小为8个·字节,数组地址被赋值或传递给其他的变量或函数后,不在是数组类型数据性质的东西。
所谓的数组”内涵“就是指针是不是数组这种数据类型。失去”内涵“就是指针已经不能代表数组数据类型了,变成一个单纯的指针类型。
这里要搞清楚sizeof是用来干什么的,sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。返回数据类型所占内存大小啊。
sizeof(1)==sizeof(int)
sizeof(1.1)==sizeof(double)
sizeof(p)==sizeof(char*)
sizeof(str)==sizeof(char*)
sizeof(tmp)==sizeof(tmp)
虽然我们知道数组名是一常量指针,但是别忘了数组也是一种数据类型。所以当p=tmp后,p仍然是char*类型,而不能异想天开“=”就数组数据类型都赋给了p。sizeof就是用来计算数据类型所占的内存大小的操作符,所以sizeof(p)==8。当sizeof(tmp)的时候,就会计算出数组数据类型占内存多少个字节,一算发现占用了20个字节。
在函数中,数组名当作实参传入函数,传入的也只是一个单纯的指针。我们设计了这样的程序:
int main(void){
str[]="I love you";
str++;
return 0;
}
上面程序 指定编译错的,因为数组名是个常量指针,但是你按下面写就是正确的。
void fun(char str[]){
str++;
}
int main(void){
str[]="I love you";
fun(str);
}
说明数组名传递进去就不在有数组的“味道”了。
strlen是一个函数,而非sizeof那样是个操作符。他就是计算从当前位置到'\0'有多少个字符。sizeof则是计算数据类型占多少内存。是两个差异迥然的东西。可能产生模糊的事例:
str1[] = "I love you";
sizeof(str1) == 11
strlen(str1)==10
字符数组是一种数据类型,占用10+1('\0')内存。所以用sizeof(数据类型)=所占内存大小11;而strlen就是一个函数,就是数一下指针当前位置到'\0'有多少个字符。确切的说就是字符串的长度,‘\0’是人为加入的控制符,它占内存但是不属于字符串本身。故I love you字符串长度就为10。
strlen(str1+1)==9,可以很清楚的看出strlen就是一个当前指针到'\0'有多少个字符(不包含'\0')。
数组这东西,作为一种数据类型,应该不会简单的是一个常数指针+一段内存,指定在编译上作了处理(我猜的)。
1)sizeof()计算数据类型所占内存大小
2)strlen()计算当前指针位置到'\0'有字符(不含'\0')
3)数组是一种数据类型,赋值和函数传递不会携带数组数据类型这个特征,而是单纯的指针。
本人是外行人,自发学习c语言,记录一下,可能有很多错误想法。