相关数组名的解析,会引入一点sizeof以及strlen函数的内容
借助本篇文章对大家日常使用的操作符sizeof以及strlen函数进行一个详细的解析,通过本篇文章也可以深入了解字符,字符串,二维数组的一些相关知识
提示:以下是本篇文章正文内容,下面案例可供参考
sizeof相关注意点
1.我们日常使用的sizeof为求类型所占内存大小(单位:字节)的操作符,这里需要注意一下,sizeof为操作符不是函数
2.sizeof()括号内的运算不改变变量本身
我们可以看到在sizeof内部a进行了++,但是我们从结果来看,这里的++并未改变a的数值,所以我们可以知道,sizeof()内部的运算不改变变量的数值
3.sizeof ()括号内引用数组首元素地址,这里的sizeof(arr)表示的是整个数组的大小(单位:字节),由此我们引入两个相关数组名的特殊情况
a.sizeof()引用数组名(arr一定是单独出现的,括号内只能有arr不能有任何其他的元素)的时候,是表示整个数组
b.&数组名,代表的也是整个数组
二、strlen函数
strlen函数的相关注意点:
2.strlen函数()在括号内需要传进去的只能是变量的地址
3.strlen函数计算的是‘\0’之前的所有字符,不包括‘\0’字符
前提:指针大小只有4(32位)/8(64位)的字节大小
1.sizeof (a) 在sizeof内部引用数组名,并且只有数组名,所以这里求的就是整个数组的大小(单位:字节),因为是整型数组,所以每个元素是4个字节,4个元素就是16个字节
2.sizeof(a + 0) 我们可以知道*(a+0)= a[0]所以(a+0)就是首元素的地址,sizeof求变量地址的值就是4(32位)或者8(64位)
3.sizeof(*a) 我们可以知道*a = *(a+0)=a[0]所以sizeof求的是首元素a[0]的大小,因为a[0]是一个整型元素,所以求的数值为4
4.sizeof(a + 1) 我们可以知道 *(a+1) = a[1] 所以sizeof求的就是元素a[1]的地址,sizeof求变量地址的值就是4(32位)或者8(64位)
5.sizeof(a[1]) 我们可以知道 a[1] 就是求元素的大小,因为a[1]是整型所以所求的数值为4
6.sizeof(&a) 拿到的是整个数组a的地址,既然是地址所以sizeof求变量地址的值就是4(32位)或者8(64位)
7. sizeof(*&a) 这里拿到整个数组a的地址后解引用,作用同第1个一样都是求整个数组的大小,即16个字节
8.sizeof(&a + 1) 这里拿到整个数组的地址后加+1跳过整个数组,跳到下一个变量地址中,值是随机值,但是+1后得到的仍然是地址,所以求得值就是4(32位)或者8(64位)
9.sizeof(&a[0]) 这里拿到的是元素a[0]的地址,所以求得值就是4(32位)或者8(64位)
10. sizeof(&a[0] + 1) 这里用a[0]的地址+1,得到的是a[1]的地址,所以求得值就是4(32位)或者8(64位)
运行结果:
32位平台:
64位平台:
1.sizeof (arr) 在sizeof内部引用数组名,并且只有数组名,所以这里求的就是整个数组的大小(单位:字节),因为是字符数组,所以每个元素是1个字节,6个元素就是6个字节
2.sizeof(arr + 0) 我们可以知道*(arr+0)= arr[0]所以(arr+0)就是首元素的地址,sizeof求变量地址的值就是4(32位)或者8(64位)
3.sizeof(*arr) 我们可以知道*arr = *(arr+0)=arr[0]所以sizeof求的是首元素arr[0]的大小,因为arr[0]是一个字符元素,所以求的数值为1
4.sizeof(arr[1]) 我们可以知道 sizeof求的就是元素arr[1]的大小因为arr[1]是一个字符元素,所以求的数值为1
5.sizeof(&arr) 这里拿到的是整个数组的地址既然是地址求得的值就是4/8
6.sizeof(&arr + 1) 这里拿到整个数组的地址后+1跳过的是整个数组,但是依然得到的是地址,既然是地址求得的值就是4/8
7.sizeof(&arr[0] + 1) 这里拿到第一个元素的地址后+1拿到arr[1]的地址,既然是地址求得的值就是4/8
8.strlen(arr) 这里传进去数组的首元素地址,所以就是从字符‘a’开始计算,由于这是一个字符数组,它没有规定‘\0’的位置,所以求出来的字符长度是随机值。
9.strlen(arr + 0) 这里的arr+0拿到的是第一个元素的地址,即就是首元素的地址,所以值同strlen(arr) 一样
10.strlen(*arr)这里拿到数组的首元素地址后解引用,拿到字符a,所以这样就导致了传进strlen函数中的不是变量地址,而是变量本身,这样就把字符a对应的ASSIC码值传进去了,这样会导致程序出错,无法运行
11. strlen(arr[1]) 和 strlen(*arr)一样都是拿到的变量本身的地址,会导致程序出错
12. strlen(&arr) 拿到的是数组整个的地址,但是数组的全部地址也是从首地址开始,所以得到的数值同strlen(arr)一样
13.strlen(&arr + 1) 这里拿到数组arr整个的地址后+1跳过整个数组,进入下一个变量地址中,由于我们不知道这个具体变量所以得到仍然是随机值
14.strlen(&arr[0] + 1) 这里拿到数组首元素的地址后+1得到的是arr[1]的地址,那么就是从arr[1]开始计算字符的长度,由于不知道‘\0’的位置所以求出来的是随机值
运行结果:
由于 10,11会导致程序出错所以在这里就将10,11两条语句省去了
32位平台:
64位平台:
1.sizeof(arr) 这里拿到的是整个数组,sizeof计算整个数组的大小,这道题不同上方的就是,这是一个字符串,字符串结尾是默认带有‘\0’的,‘\0’也是字符,所以这样求出来的值是7
2.sizeof(arr + 0) 我们知道*(arr+0) = arr[0]所以这里拿到的是首元素地址,地址求数值就是4/8
3.sizeof(*arr) 这里拿到的是数组的首元素,因为是char类型变量所以求得数值为1
4.sizeof(arr[1]) 这里拿到的是数组的第二个元素,因为是char类型变量所以求得数值为1
5.sizeof(&arr) 这里拿到的是数组的全部地址,地址求值就是4/8
6.sizeof(&arr + 1) 这里拿到整个数组的地址后+1跳过整个数组,但依然还是地址,所以结果还是4/8
7.sizeof(&arr[0] + 1) 这里拿到数组首元素后+1拿到的是arr[1]的地址,所以求得数值为4/8
8.strlen(arr) 这里传进去数组首元素所以是从第一个字符开始累加,加到‘\0’之前,即我们可以看到的字符所以数值为6
9.strlen(*arr)这里拿到数组的首元素地址后解引用,拿到字符a,所以这样就导致了传进strlen函数中的不是变量地址,而是变量本身,这样就把字符a对应的ASSIC码值传进去了,这样会导致程序出错,无法运行
10.strlen(arr[1]) 和 strlen(*arr)一样都是拿到的变量本身的地址,会导致程序出错
11.strlen(&arr) 这里拿到的是整个数组的地址,虽然是整个数组,但是也是从首元素开始读取,所以也是求的字符串的长度
12.strlen(&arr + 1) 这里拿到的是数组的全部地址后+1,得到的是另一块的随机地址,所以求学出来的长度值是随机的
13.strlen(&arr[0] + 1) 这里拿到的元素arr[0]的地址后+1传进去,所以传进去的是arr[1]的地址,那么就是从arr[1]开始计算字符串的长度,因为少了一个字符,所以长度的数值为5.
9,10两个程序会使程序运行出错这里把这两个就省去了
32位平台:
64位平台:
4.指针
1.sizeof(p) 这里p是一个指针变量,存放的是字符串的首地址,是地址所以值就是4/8
2.sizeof(p + 1) 这里指针p+1得到的是字符串的第二个字符的地址,是地址所以值就是4/8
3.sizeof(*p) 这里拿到字符串首地址后解引用得到字符a因为是char类型,所以大小为1
4.sizeof(p[0])这里同sizeof(*p)一样
5.sizeof(&p) 这里拿到的是指针变量p的地址,是地址所以值就是4/8
6.sizeof(&p + 1) 这里拿到数组的指针的地址后+1指向的内存中随机的一块内存地址,但它还是地址,值就是4/8
7.sizeof(&p[0] + 1) 这里拿到字符串首元素地址后+1拿到的是字符串中的第二个字符的地址,值就是4/8
8.strlen(p) 这里拿到的是字符串的首地址,传进去就是就字符串的长度为6
9.strlen(p + 1) 这里拿到字符串的首地址后+1,拿到字符串中的第二个字符的地址,所以从第二个地址后开始计算字符串的长度为5
10.strlen(*p) *p解引用得到字符a传进去的不是地址,会导致程序出错
11.strlen(p[0])同strlen(*p)程序会出错
12. strlen(&p)这里拿到的是指针变量的地址,注意这里的指针变量地址并不是字符串的地址,这里的指针变量只是存储字符串的地址,指针变量是有自己的地址的,所以这里拿到的是指针变量的地址,所以求得是随机值
13.strlen(&p + 1) 这里拿到指针变量的地址+1,指向的是一块内存的随机地址,所以求出的也是随机值
14.strlen(&p[0] + 1) 这里的p[0] = *(p+0)所以这里拿到的是字符串的首地址,然后+1得到的就是p[1]的地址,从p[1]开始计算字符串的长度,数值为5
运行结果:(10,11会导致程序出错,所以结果不予展示)
32位平台:
64位平台:
1.sizeof(a) 这里拿到的是整个数组的元素 ,所以求得数值为 4*3*4 = 48
2.sizeof (arr[0][0]) 拿到的是二维数组的首元素,所以求的就是首元素的大小,因为是整型所以大小为4
3.sizeof(a[0])这里拿到的是a[0],a[0]是第一行的数组名,表示第一行的地址,所以求出来数值为4*4 = 16
4.sizeof(a[0] + 1)数组名并没有单独放在sizeof内部也没有&,所以a[0]表示首元素的地址,就是第一行这个数组的第一个元素的地址,所以+1就是第一行,第二个元素的地址所以求出来是4/8
5.sizeof(*(a[0] + 1)) 拿到的数组第一行,第二个元素的地址后解引用得到第一行,第二个元素,对应的是整型所以数值为4
6.sizeof(a + 1) 数组名并没有单独放在sizeof内部也没有&所以a表示首元素地址(第一行地址)所以a+1就是第二行的地址是地址就是4/8
7.sizeof(*(a + 1))这里拿到的是数组的第二行地址后解引用得到的是数组的第二行元素的大小一个是 4* 4 = 16
8.sizeof(&a[0] + 1) 这里拿到的第一行地址后+1拿到的是第二行的地址,所以地址求值就是4/8
9.sizeof(*(&a[0] + 1)) 这里拿到第二行的地址后解引用得到的是第二行的元素,所以数值为4 * 4 = 16
10.sizeof(*a) 数组名单独放在sizeof里,所以拿到第一行的地址解引用得到第一行的所有元素 所以数值 4* 4 = 16
11.sizeof(a[3]) 这里的a[3]只是一个假设,我们知道sizeof()括号里的内容是不参与运算的(所以不会造成越界访问),所以a[3]只是假设如果有第四行它的大小是多少,所以数值是4* 4 = 16
32位平台:
64位平台:
提示:这里对文章进行总结:
这就是对各类数组名以及sizeof和strlen的一个解析,如果有错希望大家指出,谢谢大家支持