数组运算的学习

一、1.sizeof的概念

sizeof是C语言的一种单目操作符,和C语言的其他操作符++、--一样,它不是函数。sizeof操作符一字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。

2.sizeof的使用方法

(1)用于数据类型

sizeof使用形式:sizeof(type)

数据类型必须用括号括起来,如sizeof(int)。

(2)用于变量

sizeof使用形式:sizeof(var_name)或者sizeof var_name

变量名可以不用括号括起来,如sizeof(var_name),sizeof var_name等都是正确形式。但是最好带上括号,这种用法最普遍也最安全。

注意:sizeof操作符不能用于函数类型、不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数据类型、未知内容的结构或联合类型、void类型等。

  如sizeof(max) ,若此时变量max定义为intmax(),sizeof(char_v)若此时char_v定义为char char_v[MAX]且MAX未知,sizeof(void)都不是正确形式。

3、sizeof的结果

 sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型,该类型保证能容纳实现所建立的最大对象的字节大小。

(1)若操作数具有类型char 、usigned char 或 signed char,其结果都是1。

ANSIC正式规定字符类型是1字节。

(2)int(4)、unsigned int(4)、short int(2)、unsigned short(2)、long int(4)、unsigned long(4)、float(4)、double(8)、long double(8)类型的sizeof在ANSIC中没具体规定,大小依赖于实现括号内为sizeof的结果。

(3)、当操作数为指针时,sizeof依赖于编译器。例如Microsoft c/c++7.0中,near类指针字节数为2,far、huge类指针字节数为4,。一般Unix的指针字节数为4,一般来说指针字节数为4.

(4)、当操作数具有数组类型时,其结果是数组的总字节数。

(5)、联合类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的sizeof是这种类型对象的总字节数,包括任何垫补在内。

(6)、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针大小。

四、sizeof与其他操作符的关系

  sizeof的优先级为2级,比/、%等3级运算符优先级高。它可以与其他操作符一起组成表达式。

五、sizeof的只要用途

(1)、sizeof操作符的一个主要用途是存储分配和I/O系统那样的例程进行通信。例如:void*malloc(size_t size),

size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream).

(2)、sizeof的另一种主要用途就是计算数组元素的个数。

下面我们来看几个例子。

#include<stdio.h>

int main()

{  

   int a[] = { 1, 2, 3, 4 };

   printf("%d\n", sizeof(a));   //16,sizeof(int)是4,数组a有四个元素,每个元素都是int型,所以大小                    为4*4=16

   printf("%d\n", sizeof(a+0));//4  a+0是第一个元素地址,地址就等于指针,所有指针变量所占空间都                   是4

    printf("%d\n", sizeof(*a));//4  第一个元素的大小
    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+1));//4   取数组a的地址再加1也是地址,跳过整个数组
    printf("%d\n", sizeof(&a[0]));//4   第一个元素的地址
    printf("%d\n", sizeof(&a[0]+1));//4  第二个元素的地址

}



   strlen函数所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含"\0")。


 1、原型:extern unsigned int strlen(char *s);,在Visual C++ 6.0中,原型为size_t strlen(const char *string);,其中size_t实际上是unsigned int,在VC6.0中可以看到这样的代码:typedef unsigned int size_t;
头文件:string.h
格式:strlen (字符数组名)
功能:计算字符串s的(unsigned int型)长度,不包括'\0'在内
说明:返回s的长度,不包括结束符NULL。
2、相关函数:
TCHAR.H routine _UNICODE & _MBCS not defined_MBCS defined_UNICODE defined_tcslen
下面看一个例子。
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };

printf("%d\n", strlen(arr));//随机值  因为没有‘\0’ printf("%d\n", strlen(arr + 0));//随机值 和arr一样 printf("%d\n", strlen(*arr));//程序崩溃 printf("%d\n", strlen(arr[1]));//程序崩溃 printf("%d\n", strlen(&arr));//随机值 printf("%d\n", strlen(&arr + 1));//随机值 printf("%d\n", strlen(&arr[0] + 1));//随机值 }

我们再来看一下二维数组
看例子
#include<stdio.h> int main()
{
int a[3][4] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23 }; printf("%d,%d\n", a, *a);//0行首地址和0行0列元素的值 printf("%d,%d\n", a[0], *(a+0));//0行0列元素地址 printf("%d,%d\n", &a[0], &a[0][0]);//0行首地址和0行0列元素的值 printf("%d,%d\n", a[1], a+1);//1行0列首地址和1行首地址 printf("%d,%d\n", &a[1][0], *(a+1)+0);//1行0列元素地址 printf("%d,%d\n", a[2], *(a+2));//2行0列元素地址 printf("%d,%d\n", &a[2], a+2);//2行首地址  printf("%d,%d\n", a[1][0], *(*(a+1)+0));//1行0列元素的值 printf("%d,%d\n", *a[2], *(*(a+2)+0));//2行0列元素的值 return 0; }
运行结果


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值