Java程序猿学习C++之数组和动态数组

数组:

#include <iostream>
using namespace std;

//模板函数
template <class T>
void dump(T val)
{
	cout << ">>>>" << __FUNCTION__ << endl;//内置的宏,打印当前函数的名字
	cout << sizeof(val) << ":" << typeid(val).name() << endl;
	cout << "<<<<" << __FUNCTION__ << endl << endl;
}

void dump1(int a[])
{
	cout << "a=" << a << endl;//第一个元素的地址
	cout << "&a=" << &a << endl;//指针的指针
	cout << "a+1=" << a + 1 << endl;//数组第二个元素的地址(+4)
	cout << "&a+1=" << &a + 1 << endl;//指向指针地址的下一个变量(+4)
}

int main()
{
	const int len = 6;
	int a[len] = { 0, 2, 4, 6, 8 };//赋值少一个没关系,没有赋值会有默认值0
	int *pa = a;
	int *pa2 = a;
	//a是一个指针指向数组的第一个元素
	cout << "a=" << a << endl << "&a[0]=" << &(a[0]) << endl;

	for (int i = 0; i < len;i++)
	{
		a[i] = i;
		cout << "a[" << i << "]=" << a[i] << " "
			 << "*(a+i)=" << *(a + i) << " "
			 << "*(i+a)=" << *(i + a) << " "  //由上面表达式依据加法的结合律
			 << "i[a]=" << i[a] << " "

			 //cout << *(a++) << endl;//编译出错。a是数组的首地址(相当于常量),不能再对a进行赋值了
			 << "*(pa++)=" << *(pa++) << " "
			 << "pa[" << i << "]=" << pa2[i] << " "
			 << "*(pa+i)=" << *(pa2 + i) << " "
			 << "i[pa]=" << i[pa2] << " "
			 //综上,操作数组能够通过数组名,也能够通过指针变量
			 << endl;
	}
	cout << "===================数组类型和指针类型=======================" << endl;
	cout << sizeof(a) << ":" << typeid(a).name() << endl;//24:int[6]
	dump(a);//4:int*
	//在数组声明的作用域之内,a是数组类型;在作用域之外(包含函数传递),a退化成一个整形指针

	cout << "====================数组类型取地址======================" << endl;
	cout << "a=" << a << endl;
	cout << "&a=" << &a << endl;//和上面的值一致都是第一个元素的地址
	cout << "a+1=" << a+1 << endl;//数组第二个元素的地址(+4)
	cout << "&a+1=" << &a+1 << endl;//数组后一个变量的地址(+4*6)

	cout << "====================指针类型取地址======================" << endl;
	dump1(a);
	return 0;
}

动态数组:

#include <iostream>
using namespace std;

/*C++内存管理
  栈:编译器自己主动分配和删除变量的区
      存储如局部变量,函数參数等。
	  高效但空间有限
  堆:存储由应用程序分配和删除的区
      不释放分配的内存会造成内存泄露
  全局/静态存储区:存储全局变量和静态变量
  常量存储区:存放常量,不同意改动
*/
int main()
{
	//动态数组定义格式:int *a = new int[array_size];
	//释放格式:delete []a;
	int len = 0;
	cin >> len;
	int *p = new int[len];

	for (int i = 0; i < len;i++)
	{
		p[i] = i;
		cout << "p[i]=" << p[i] << endl;
	}

	delete []p;
	return 0;
}

差别:

二维的数组:

#include <iostream>
using namespace std;

void print1(int a[2][3], int rowLen, int colLen)
{
	cout << "=============print1===========" << endl;
	//4:(*)[3]事实上就是指向二维数组的指针
	cout << sizeof(a) << ":" << typeid(a).name() << endl;
	for (int row = 0; row < rowLen; row++)
	{
		int *p = a[row];
		for (int col = 0; col < colLen; col++)
		{
			cout << "a[" << row << "][" << col << "]="
				<< a[row][col] << " "
				<< *(p + col) << " "
				<< p[col] << " "
				<< *(*(a + row) + col) << " "
				<< endl;
		}
	}
}

void print2(int (*a)[3], int rowLen, int colLen)
{
	cout << "=============print2===========" << endl;
	for (int row = 0; row < rowLen; row++)
	{
		int *p = a[row];
		for (int col = 0; col < colLen; col++)
		{
			cout << "a[" << row << "][" << col << "]="
				<< a[row][col] << " "
				<< *(p + col) << " "
				<< p[col] << " "
				<< *(*(a + row) + col) << " "
				<< endl;
		}
	}
}

int main()
{
	//二维数组
	const int I_ROW = 2;
	const int I_COL = 3;
	int a[I_ROW][I_COL] = { 1, 2, 3, 4, 5, 6 };
	//int a[][I_COL] = { 1, 2, 3, 4, 5, 6 };第一维的能够省略
	print1(a, I_ROW, I_COL);

	//指向二维数组的指针变量。格式:数据类型 (*指针名)[一维数组长度]
	//int(*p)[4]
	print2(a, I_ROW, I_COL);

	//指针数组,格式:数据类型 *数组名[数组长度]
	//char *ary[2] = {str1,str2}
	//二维数组和指针数组的区别?
	char str1[] = "hello";
	char str2[] = "test";
	char str3[] = "!!";

	char array1[3][8] = { "hello", "test", "!!" };//数组里面存储了字符串数据
	char *array2[3] = { str1, str2, str3 };//数组里面存储了指向字符串数据的地址
	char *array3[3] = { array1[0], array1[1], array2[2] };//数组里面存储了指向字符串数据的地址

	return 0;
}
时间: 2024-11-08 19:06:34

Java程序猿学习C++之数组和动态数组的相关文章

Java程序猿学习当中各个阶段的建议

回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议 引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容基本上忘得一干二净,所以写这篇文章其实是很有难度的. 但是,最近问LZ的人实在是太多了,为了避免重复回答,给自己省点力气,干脆就在这里统一回复了. 其实之前LZ写过一篇文章,但是那篇文章更多的是在讨论“面试前该不该刷题”这个

人在囧途——Java程序猿学习Python

引言 LZ之前其实一直对python都很好奇,只是苦于平时没有时间去了解它,因此趁着51假期这个机会,便迫不及待的开始了自己的探索.作为一个标准的Java程序猿,在了解python的过程当中,LZ遇到了很多囧事,接下来LZ就一一给大家说道说道.本文纯属看个乐子,非python教学. 囧事一:eclipse插件安装篇 由于LZ习惯了使用eclipse进行开发,因此对python的研究,还是希望可以在eclipse上进行试验.那么第一件事,自然是安装python的eclipse插件,于是百度.goo

回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议

其实本来真的没打算写这篇文章,主要是我得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.我自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容基本上忘得一干二净,所以写这篇文章其实是很有难度的. 但是,最近问我的人实在是太多了,为了避免重复回答,给自己省点力气,干脆就在这里统一回复了. 其实之前我写过一篇文章,但是那篇文章更多的是在讨论"面试前该不该刷题"这个话题,而这篇文章将会更加聚焦在面试前如何准备,以及工作当中如何学习这个话题上,而

Java程序猿学习C++之字符串

#include <iostream> #include <string.h> using namespace std; int my_len(const char *str) { int len = 0; // while (*str != '\0') // { // ++len; // ++str; // } while (*(str++) != '\0') { ++len; } return len; } void my_cpy(char *dst,const char *s

面试?顺谈Java程序员学习中各阶段的建议

第一个问题:阿里面试都问什么? 这个是让LZ最头疼的一个问题,也是群里的猿友们问的最多的一个问题.说实话,LZ只能隐约想起并发.JVM.分布式.TCP/IP协议这些个关键字,具体的问题真的是几乎都没记住.而且就算LZ记住了,也告诉你了,你也背会了,但LZ觉得,在面试中,你被问到一模一样问题的可能性依然很小. 甚至,就算你运气好被问到了,你也照着背下来了,也不一定就能对你的面试起到正面的作用,因为面试官万一多问一句,你可能就露馅了,那还不如干脆点说不会更好. LZ参加的是阿里的社招面试,而社招不同

聊聊阿里社招面试,谈谈“野生”Java程序员学习的道路

阿里社招面试都问什么? 和之前一样,文章一上来,我们先来谈谈阿里的社招面试都问什么,其实这个话题并不是什么秘密,所有来阿里面试过的同学,都能回答一二. 两年前的时候,笔者在文章里是这么回答的. 这个是让LZ最头疼的一个问题,也是群里的猿友们问的最多的一个问题. 说实话,LZ只能隐约想起并发.JVM.分布式.TCP/IP协议这些个关键字,具体的问题真的是几乎都没记住.而且就算LZ记住了,也告诉你了,你也背会了,但LZ觉得,在面试中,你被问到一模一样问题的可能性依然很小. 甚至,就算你运气好被问到了

Java程序猿的JavaScript学习笔记(1——理念)

计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript学习笔记(3--this/call/apply) Java程序猿的JavaScript学习笔记(4--this/闭包/getter/setter) Java程序猿的JavaScript学习笔记(5--prototype) Java程序猿的JavaScript学习笔记(6--面向对象模拟) Java程

Java程序猿的JavaScript学习笔记(9—— jQuery工具方法)

计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript学习笔记(3--this/call/apply) Java程序猿的JavaScript学习笔记(4--this/闭包/getter/setter) Java程序猿的JavaScript学习笔记(5--prototype) Java程序猿的JavaScript学习笔记(6--面向对象模拟) Java程

JAVA程序猿怎么才干高速查找到学习资料?

JAVA程序猿怎么才干高速查找到学习资料? JAVA学习资料在互联网上较为零散,并且大多是英文的.以下介绍3种方式,让程序猿能够高速地找到自己想要的资料. 一.导航站点: 有非常多类似hao123的站点,整合了非常多程序相关的资源,比如有一个"精简导航",依照语言的分类,整合了非常多的学习资源,网址是http://www.brieftools.info/ ,我们仅仅须要进入导航站,找到JAVA相应的资源就可以.导航上还有非常多其它语言的资源,假设后期准备学站点相关的东西,导航上面也有相