博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
每日一题(六)
阅读量:3952 次
发布时间:2019-05-24

本文共 1838 字,大约阅读时间需要 6 分钟。

文章目录

9.21数组、字符串的存取效率

在程序中,对数组和字符串的存取,哪个更有效率?

先看一段程序:

#include "stdio.h"int main() {
char a = 1; char c[] = "123456789"; char *p = "123456789"; a = c[1]; a = p[1]; return 0;}

声明了一个数组c和一个字符串p,然后同样读取其中的一个值,对应的汇编代码如下:

10:a=c[1];004010678A4DF1 movcl,byteptr[ebp-0Fh]0040106A884DFC movbyteptr[ebp-4],cl11:a=p[1];0040106D8B55EC movedx,dwordptr[ebp-14h]004010708A4201 moval,byteptr[edx+1]004010738845FC movbyteptr[ebp-4],al

可以看出对于a = c[1]的操作,是直接将数组中字符串的元素读取到c1寄存器中(也就是a)

对于a = p[1]的操作,显示将指针的值edx中,再根据地址读取字符元素

所以数组的读取比字符串的读取要有效率,即在栈上的数组比指针指向的字符串要读取快。

9.22 求一个int数据 二进制中1的个数

#include 
using namespace std;int fun (int x) {
int count = 0; while (x) {
x &= (x-1); ++count; } return count;}int main() {
int x = 0; cin>>x; cout<<"ans is :"<
<

分析:把一个整数减去1,再和原整数做 & 运算,就会把整数最右边一个1变成0,通过while(x)来计数有多少个1.

9.23 指针与引用的区别

  • 引用只是变量的一个别名,内部是依靠只读指针实现的,引用本身不占用内存空间,不能建立数组的引用
  • 引用在初始化的时候就要指明赋值;而且指针可以在允许的情况下任意时刻赋值
  • 引用不能为NULL;指针可以为NULL
  • 引用保存的是被引用变量的地址
  • sizeof 引用的大小是被引用变量的大小sizeof 指针的大小是指针本身的大小
  • 引用在源代码级相当于一个普通的变量,但是作为函数参数时,传递的是变量地址
  • 指针可以有多级,引用只能一层
  • 引用作为函数返回值传递的时候,不能返回局部变量的引用、函数内new的内存的引用

9.24 编写strcpy

**已知strcpy的函数原型:char *strcpy(char strDest, const char strSrc)其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数,请编写函数 strcpy。

#include 
#include
cahr* strcpy (char *strDest, const char *strSrc){
assert ((strDest != NULL) && (strSrc != NULL)); char *addr = strDset; while ((*strDest++ = *strSrc++) != '\0'); return addr;}
  • assert是宏,不是函数,其的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行
  • strcpy函数会连‘\0’一起拷贝
  • 要用一个临时的变量保存目标字符串的首地址,最后返回这个临时变量
  • 返回值为char* 是为了支持链式表达式

9.25引用作为函数参数的的注意

  • 不能返回局部变量的引用
  • 不能返回函数内部new产生的引用
  • 传递引用给函数与传递指针给函数的效果一样,但是指针传递参数在函数中要分配空间的,而且在函数内使用指针变量名进行运算,程序的可读性会比较差
  • 使用引用传递进来的参数,在函数运行过程中是没有产生实参的副本,是直接对地址进行操作的,所以当形参传递的数据比较大的时候,引用传递参数效果比较好

转载地址:http://gvwzi.baihongyu.com/

你可能感兴趣的文章
2754:八皇后 OpenJ_Bailian - 2754 ( 搜索 DFS )
查看>>
1027 打印沙漏 (20 分)
查看>>
1028 人口普查 (20 分)
查看>>
Numbers HDU - 5585
查看>>
1030 完美数列 (25 分)
查看>>
1031 查验身份证 (15 分)
查看>>
1032 挖掘机技术哪家强 (20 分)
查看>>
1033 旧键盘打字 (20 分)
查看>>
Longest k-Good Segment CodeForces - 616D ( 尺取法)
查看>>
二叉搜索树的实现(BST)(插入+删除+查找+各种遍历+高度)
查看>>
今夕何夕 HDU - 6112 ( 模拟 )
查看>>
Dividing HDU - 1059 ( 多重背包 - 二进制简化 )
查看>>
Robberies HDU - 2955 ( 0-1背包 )
查看>>
FATE HDU - 2459 ( 二维完全背包 )
查看>>
B. Working out CodeForces - 429B (动态规划)
查看>>
10635 - Prince and Princess UVA-10635 (最长公共子序列的O(nlogn)的解法:LCS转换为LIS)
查看>>
Sizeof和Strlen
查看>>
lower_bound和upper_bound
查看>>
Subsequence POJ - 3061 ( 尺取法 )
查看>>
find the safest road HDU - 1596 (迪杰斯特拉dijkstra)
查看>>