C语言 总结数组指针相关知识点

C语言 总结数组指针相关知识点

结论

1:数组在内存中是连续存放的。
2:内存中的一个内存单元对应一个地址。
3:在32位平台上指针是4个字节,64位平台8个字节。
4;数组的数组名其实是数组首元素的地址。

数组名代表整个数组的时候只有两种情况:

1: sizeof(数组名),这里数组名表示整个数组。
2: &数组名,这里数组名表示整个数组。

例子:(32位)

#include<stdio.h>
int main()
{
    int a[] = {1,2,3,4};            // 一维数组 //(地址)int整形4个字节长度
    printf("%d\n",sizeof(a));       //16    sizeof(数组名)代表整个数组,a的长度 
    printf("%d\n",sizeof(a+0));     //4     a[0]的地址的长度      
    printf("%d\n",sizeof(*a));      //4     ‘*’解引用,元素a[0]的长度 
    printf("%d\n",sizeof(a+1));     //4     第二个元素地址的长度 
    printf("%d\n",sizeof(a[1]));    //4     第二个元素的长度 
    printf("%d\n",sizeof(&a));      //4     整个数组a的地址的长度 (取数组地址也是地址)
    printf("%d\n",sizeof(*&a));     //16    数组a的地址解引用是整个数组的长度 
    printf("%d\n",sizeof(&a+1));    //4     数组a的下一份空间的地址的长度 
    printf("%d\n",sizeof(&a[0]));   //4     第一个元素的地址的长度 
    printf("%d\n",sizeof(&a[0]+1)); //4     第二个元素的地址的长度 

    return 0;
}



2:

#include<stdio.h>
#include<string.h>
int main()
{ 
    char arr[] = {'a','b','c','d','e','f'};//字符数组//字符型一个字节长度
    printf("%d\n", sizeof(arr));      // 6        数组arr的长度
    printf("%d\n", sizeof(arr+0));    // 4       (首元素)arr[0]的地址的长度 
    printf("%d\n", sizeof(*arr));     // 1        解引用首元素a[0]的长度 
    printf("%d\n", sizeof(arr[1]));   // 1        元素a[1]的长度 
    printf("%d\n", sizeof(&arr));     // 4        数组arr的地址的长度 
    printf("%d\n", sizeof(&arr+1));   // 4        数组arr的下一份空间的地址的长度
    printf("%d\n", sizeof(&arr[0]+1));// 4        元素arr[1]的地址的长度 
    printf("%d\n", strlen(arr));      //随机值    随机值,没有'\0'结束字符产生随机值
    printf("%d\n", strlen(arr+0));    //随机值    随机值
//  printf("%d\n", strlen(*arr));     //err       strlen操作接受地址,将a的ASCII码作为地址导致错误
//  printf("%d\n", strlen(arr[1]));   //err       strlen操作接受地址,将b的ASCII码作为地址导致错误
    printf("%d\n", strlen(&arr));     //随机值    从arr首元素地址开始,遇到第一个'\0'的长度
    printf("%d\n", strlen(&arr+1));   //随机值    从arr的下一份地址空间的开始,遇到第一个'\0'的长度
    printf("%d\n", strlen(&arr[0]+1));//随机值    从arr[1]开始,遇到第一个'\0'(不包括'\0')的长度
    return 0;
}

3:

#include<stdio.h>
#include<string.h>
int main()
{ 
    char arr[] = "abcdef";            //此处定义字符串,结尾处自动补 '\0 '
    printf("%d\n", sizeof(arr));      //7      arr的长度,含'/0'
    printf("%d\n", sizeof(arr+0));    //4      arr[0]的地址的长度
    printf("%d\n", sizeof(*arr));     //1      arr[0]的长度
    printf("%d\n", sizeof(arr[1]));   //1      arr[1]的长度
    printf("%d\n", sizeof(&arr));     //4      arr的地址的长度
    printf("%d\n", sizeof(&arr+1));   //4      arr的下一份地址空间的地址的长度
    printf("%d\n", sizeof(&arr[0]+1));//4      arr[1]的地址的长度
    printf("%d\n", strlen(arr));      //6      arr的长度(不包括'\0')
    printf("%d\n", strlen(arr+0));    //6      从arr[0]起到第一个'\0'之间的长度
//  printf("%d\n", strlen(*arr));     //errr   strlen操作接受地址,将a的ASCII码作为地址导致错误
//  printf("%d\n", strlen(arr[1]));   //err    strlen操作接受地址,将b的ASCII码作为地址导致错误
    printf("%d\n", strlen(&arr));      //6      整个数组字符数 
    printf("%d\n", strlen(&arr+1));    //随机   跳过整个数组,遇见'\0'停止
    printf("%d\n", strlen(&arr[0]+1)); //5      从第二个元素向后数 
	   return 0;
}

4:

#include<stdio.h>
#include<string.h>
int main()
{ 
    char *p="abcdef";               //32位指针变量4个字节
    printf("%d\n", sizeof(p));      //4        字符 'a' 地址的长度
    printf("%d\n", sizeof(p+1));    //4        字符 'b' 的地址的长度   
    printf("%d\n", sizeof(*p));     //1        字符 'a' 的地址解引用一个字节
    printf("%d\n", sizeof(p[0]));   //1        字符 'a' 的长度
	//p[0]==*(p+0)==*(0+p)==0[]
    printf("%d\n", sizeof(&p));     //4        指针p的地址的长度(p存的首元素地址,&p指向p的地址)   
    printf("%d\n", sizeof(&p+1));   //4        指针p的地址的下一个地址空间的长度 
    printf("%d\n", sizeof(&p[0]+1));//4        字符'b'的地址的长度
    printf("%d\n", strlen(p));      //6        p所指的字符串的首元素到'\0'(不包括''\0)的长度
    printf("%d\n", strlen(p+1));    //5        p所指的字符串的第二个元素到'\0'(不包括''\0)的长度
  //printf("%d\n", strlen(*p));     //err      对p所指的字符串的第一个字符'a'进行strlen操作,导致错误
  //printf("%d\n", strlen(p[0]));   //err      p所指的字符串的第一个字符'a'进行strlen操作,导致错误
    printf("%d\n", strlen(&p));     //随机值   从指针p的地址开始,遇到第一个'\0'的长度(而不是从p存的a的地址开始)
    printf("%d\n", strlen(&p+1));   //随机值   从指针p的地址的下一个地址空间开始,遇到第一个'\0'的长度
    printf("%d\n", strlen(&p[0]+1));//5        从'b'开始,遇到第一个'\0'的长度
    return 0;
}
5:

#include<stdio.h>
#include<stdio.h>
#include<string.h>
int main()
{
    int a[3][4] = {0};               //二维数组 (二维数组首元素是第一行)        
    printf("%d\n",sizeof(a));        //48        整个二维数组的总长度
    printf("%d\n",sizeof(a[0][0]));  //4         a[0][0]的长度
    printf("%d\n",sizeof(a[0]));     //16        第0行的长度
    printf("%d\n",sizeof(a[0]+1));   //4         a[0][1]的地址的长度  
    printf("%d\n",sizeof(a+1));      //4         第2行的地址的长度    
    printf("%d\n",sizeof(&a[0]+1));  //4         第2行的地址的长度       
    printf("%d\n",sizeof(*a));       //16        第0行的长度
    printf("%d\n",sizeof(a[3]));     //16        sizeof()内部不参与运算,并没有访问,相当于a[i]第i行,任意一行长度为16
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值