C++学习(12)

1、

#include<stdio.h>
main() {
	int k,j,s;
	for(k=2;k<6;k++,k++) {
		s =1;
		for(j=k;j<6;j++)
			s+=j;
	
	printf("%d\n",s);
	}
//	printf("%d\n",s);
}

输出结果:15

10

//10


2、  定义int t[3][2],能正确表示t数组元素地址的表达式t[2].(相当于t[2][0])

 

3、  函数类型不能作为重载函数的调用的依据

(如果一个类中声明了纯虚函数,其派生类中没有对该函数定义,那该函数在派生类中仍为纯虚函数,凡是包含纯虚函数的类都是抽象类,不能用来定义对象。

 

通常重载函数调用的依据是函数名,参数类型,参数个数。

 

类的静态成员是属于类的而不是属于哪个对象的,因此可以说是所有对象所共有的

 

内联函数是在编译时将目标代码插入的。


 

如果在派生类中没有对所有纯虚函数进行定义,则此派生类仍然是抽象类,不能用来定义对象。

 

静态数据成员是所有对象所共有的。

 

内联函数在编译时将该函数的目标代码插入每个调用该函数的地方。

 

 4、

#include<iostream>
#include<string.h>
using namespace std;
int main() {
	char p1[10]="abcd",*p2,*p3,str[10]="xyz";
	p2="ABCD";
	p3=strcat(p1+2,p2+1);
	cout<<p1<<endl<<p3<<endl;
	strcpy(str+2,p3);
	cout<<str<<endl;
}
输出的结果: abcdBCD

     cdBCD

     xycdBCD

分析:

    原型:char  *strcat  ( char  *dest, const  char  *src) 
    用法:#include  <string.h> 
    功能:连接两个字符串;strcat()会将参数src字符串 拷贝到 参数dest所指的字符串尾。 第一个参数dest要有足够的空间来容纳要拷贝的字符串。 
    说明:strcat()返回dest的字符串起始地址。 


strcat 是连接函数, strcpy 是拷贝函数。(不记得可百度查下)。

strcat(p1 + 2, p2 + 1))返回值是p1+2的地址(指针),而不是P1的地址。可以用程序测试,如下图。

先执行strcat(p1 + 2 , p2 + 1),结果:cdBCD。strcpy之后的str就是xycdBCD。 

5、

#include<iostream>
void test(void *data) {
	unsigned int value = *((unsigned int *) data);//填空的地方 
	printf("%u",value);
}
using namespace std;
int main() {
	unsigned int value =10;
	test(&value);
	return 0;
}
分析1:void test(void *data) 注意,参数类型是void,所以先要进行指针转换:(unsigned int *),然后再取值。

分析2:参数是void *,编译器不知道它的具体数值类型,不能直接取值;先转换为具体指针类型,然后再取值。

分析3:data无类型指针,故要先转换指针为unsigned int指针,再取地址。


实际上只要是*data,我们就知道了它是指针,如果是32位机器,该指针就指着内存中的某个地址,用32位表示,记住这个32位只是初始地址,任何指针都是的。而前面的void 或者int 类型是定义一次读几个字节,如果是int则读4个字节,也就是从*data存的地址开始从内存往后读4个字节就行,而void是空,没有指定要读多少个字节,所以要用指针类型(unsigned int *)强制转化为知道要读几个字节的int指针,然后再用*从开始地址,读取unsigned int个字节出来!


6、int *pa[5];//表示指针数组,指一个数组里装着指针

     int (*pa)[5];//表示数组指针,表示一个指向数组的指针

数组运算符优先级高于指针和引用。


7、new 和 malloc

new建立的是一个对象;malloc分配的是一块内存;

new初始化对象,调用对象的构造函数,对应的delete调用相应的析构函数;malloc仅仅分配内存,free仅仅回收内存;

new和malloc都可用于申请动态内存,new是一个操作符;malloc是一个函数;

new/delete都是内建的操作符;而malloc是一个函数,其函数原型void *malloc(unsigned int num_bytes);因此malloc需要头文件"stdlib.h"或者"malloc.h"


new 和malloc的区别(整理) 

1,malloc与free是C++/ C语言 的标准库函数,new/delete是 C++ 的运算符。它们都可用于申请动态和释放内存。 
2. new 初始化对象,调用对象的构造函数,对应的delete调用相应的析构函数,malloc仅仅分配内存,free仅仅回收内存 。

3、new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。

4.new delete 是运算符,malloc,free是库函数。
5. new 建立的是一个对象, malloc分配的是一块内存。
6. malloc需要头文件"stdlib.h"或者"malloc.h" 。


8、

#include<stdio.h>
int inc(int a) {
	return (++a);
} 

int multi(int *a,int *b,int *c) {
	return (*c=*a * *b);
}

typedef int (* FUNC1)(int in);//函数指针定义
typedef int (* FUNC2) (int *,int *,int *);
void show(FUNC2 fun,int arg1,int *arg2) {
	FUNC1 p = &inc;//FUNC1类型 函数指针p指向函数inc的首地址
	int temp = p(arg1);//此时调用函数inc,参数为10,返回值为11
	fun(&temp,&arg1,arg2);//调用函数multi,参数为(11,10,arg2),arg2为指针变量负责带回返回值
	printf("%d\n",*arg2);//输出110
}

int main() {
	int a;
	show(multi,10,&a);//FUNC2类型函数指针fun指向函数multi的首地址
	return 0;
}
输出结果:110

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值