C/C++语言杂谈

//  sizeof不能用来计算字符串的长度,计算字符串长度的函数为strlen() 函数,strlen函数计算字符串长度的时候不包含后面的‘\0’,用 sizeof 求数组所占用的字节的时候,当是字符串数组时,计算 sizeof 的时候会计算后面的 ‘\0’ 结束标志,如: char arr [ ] = {"abcdefg"};  那么 sizeof(arr) = 8;

// 一般的参数传递属于值传递,当数组作为参数传递的时候,是地址传递,在子函数里面有两种写法:

1、void  function( char  str[ ] )

2、void  function( char *str )

(也可以是其他类型)

3、联合体(union)的大小取决于它所有的成员中占用空间最大的一个成员的大小,并且对于符合数据类型,如  union、struct、class 的对齐方式为成员中最大成员的对齐方式。

32 为系统中,int 占4个字节,short 占2个字节,char 占1个字节,double 占8个字节,float 占4个字节,long 占4个字节

#include<iostream.h>

union  u

{

double  a;

int  b;

};

union  u2

{

char  a[13];

int  b;

};

union  u3

{

char  a[13];

char  b;

};

对于 u 来说,其大小就是最大的 double 类型成员 a 了,所以 sizeof(u)== sizeof(double)== 8

对于 u2 来说,最大的是 char [13] 类型的数组,但是由于另一个成员 int b 的存在,u2 的对齐方式也就是 4,所以 u2 的大小必须在 4 上对齐,占用的空间由 13 变为了 16

对于 u3 来说,大小也就是 sizeof(u3)== 13

但是对齐的方式是可以更改的:

#include<iostream.h>

#pragma pack(2)  // 编译器对齐方式取为 2

union u

{

char  str[9];

int  a;

};

C++ 里面固有类型的对齐方式取编译器对齐方式与自身大小中较小的一个

上面的程序中,由于使用了手动更改对齐方式为2,所以 int 的对齐方式也变为了 2 ,虽然 int 自身的大小为 4 ,u 的对齐成员中,最大的对齐也是 2 ,因此sizeof (u)== 10

//  用指针赋值

#include<stdio.h>

int main()

{

char a [ ] = "hello, world";

char  *ptr = a;

printf ("%c \n", *(ptr + 4));

printf ("%c\n", ptr [ 4 ]);

printf ("%c\n", a[4]);

printf("%c\n",*(a+4));

*(ptr + 4) + =1;

printf ("%s\n", a);

return 0;

}

ptr[4] 和 *(ptr + 4) 是一样的,并且也和 a[4] 和*(a+4)是一样的,都是字母 o。

而*(ptr+4)+ =1 也就是相当于 a[4] = a[4] + 1,即 a[4] 的值为 p(这里用到了强制类型转换)

输出为:o o o o p

// 对字符串数组进行初始化的时候,必须在定义的同时进行初始化,而不能先定义,再初始化

比如:

char  arr [ ];

arr = {" hello , world ! "};

这样赋值是不行的,因为 arr 是数组的首地址,是一个常量,所以不能把常量赋值给常量,必须按照下面的赋值方式

 char arr [ ] = { " hello,world! " };

or

char arr [ ] = {‘h’,'e','l','l','o',' ','w','o','r','l','d','!'};

单个赋值和以字符串的形式赋值有一点不同是在字符串赋值的时候,数组最后会有一个 ‘ \0 ’ 默认字符串结束的字符,所以也比单个赋值多了一个字节

// 三维动态数组的定义和释放

#include<stdio.h>

#inlcude<stdlib.h>

int main()

{

int  ***arr ;

int n1,n2,n3;

int i,j,k;

scanf("%d%d%d",&n1,&n2,&n3);

if((arr=(int ***)malloc(n1*sizeof(int **)))==NULL)        // 第一维数组的创建

{

printf("分配内存空间失败!\n");

return 0;

}

for (i=0;i<n1;i++)

{

if((arr[i]=(int **)malloc(n2*sizeof(int *)))==NULL)  // 第二维数组的创建

{

printf("分配内存失败!\n");

return 0;

}

for(j=0;j<n2;j++)

{

if((arr[i][j]=(int *)malloc(n3*sizeof(int)))==NULL)  // 第三维数组的创建

{

printf("分配内存失败!\n");

return 0;

}


}

}

for(i=0;i<n1;i++)

for(j=0;j<n2;j++)

for(k=0;k<n3;k++)

{

arr[i][j][k]=i+j+k+1;

printf("%d ",arr[i][j][k]);

}

for(i=0;i<n1;i++)

for(j=0;j<n2;j++)

free(arr[i][j]);         //释放第三维

for(i=0;i<n1;i++)

free(arr[i]);   // 释放第二维

free(arr);    //释放第一维

return 0;

}

// 一般选择前缀方式递增递减:++n 而不是后缀的形式:n++

// 函数完整的声明方法:

[修饰符]  返回类型  名称(参数) [override] [const] [final]

其中的方括号是可选项,而不是字面上的意思,final 表示后面可以有很多,如果修饰符有多个,那么他们之间用空格分开,而不是逗号,比如声明一个既是 static 又是 inline 的函数:  static  inline  int  hello_world();

// 函数可以重载的唯一条件是参数的类型不同,即使是返回值类型不同,但是如果参数类型相同的话,那也是不可以重载的,比如:

int  hello_world(int n);  和 double  hello_world( double n ); 这样是可以重载的,但是下面的却不行

int  hello_world  (int n);和 double  hello_world( int n ); 这样编译器就会报错:重载函数不够唯一

// const 关键字的用法,最重要的一条规则是:一个非 const 的值可以作为 const 参数被传递,但一个 const 值不能作为非 const 值被传递,如:

<span style="font-size:18px;">const double pi = 3.1415926;
void display_value(const double &x);
display_value(pi);// 这样是可以的
// 或者下面也是可以的
double x=3.15;
void display_value(const double &x)
display_value(x);// 把非const 值转换为
// const值,但是下面的是不行的:
const double pi = 3.1415926;
void display_value(double &pi)
display_value(pi);</span>



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Micrle_007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值