
定义数组时需要注意以下几点。
① 数组中的元素是同一类型。
② 数组所在内存中占有的字节数在数组定义时就确定,并且是连续排列的。其大小等于数组元素类型的大小乘以数组元素的个数,也可以通过运算符sizeof(数组名)来求其在内存中的字节数。
③ 数组的大小必须是常量,不能是变量,下面的定义是错误的:
int length = 100;
int a[length]; 例911 下列程序段中对数组定义错误的是( )。
A.int a[10+2] B.int length = 10; in a[length]
C.int const length = 10; int a[length] D.int a[12]
答案:B 912 考点2:数组的初始化 数组初始化是指在数组说明时给数组元素赋予初值,因为初始化是在编译阶段进行的,所以相比运行时赋值,将减少运行时间,提高效率。一般格式如下:
<类型说明符> <数组名>[常量表达式] = {值,值……值};
例如:
int a[5] = {1, 2, 3, 4, 5}; // 把整形数组a中5个元素的初值依次初始化成1、2、3、4、5。
char str[10] = {'H' , 'e', 'l', 'l', 'o'}; // 把字符数组中的前五个元素依次初始化成H、e、l、l、o。 初始化数组需要注意以下几点。 ① 可以只给部分元素赋初值。当“{}”中值的个数少于元素个数时,只给前面部分元素赋值。例如,“int a[10]={0,1,2,3,4};”表示只给a[0]~a[4]赋值,而后5个元素自动赋0值。不能赋值的数据个数多于数组的大小,否则编译器会报错。提倡给数组赋初值,这样会屏蔽由于编译器的不同对某些类型的元素自动赋值不一样的问题,达到程序是可控的目的。
② 只能给元素逐个赋值,不能给数组整体赋值。例如,给10个元素全部赋1值,只能写成“int a[10]={1,1,1,1,1,1,1,1,1,1};”,而不能写成“int a[10]=1;”。如下的程序都是错误的:
int a[10] = {1};
int b[10];
b = a;
如果我们想把数组a内元素一一对应赋给b内的元素,应使用以下方法:
for (int i = 0; i < 10; i++)
{
b[i] = a[i];
}
③ 如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。例如,“int a[5]={1,2,3,4,5};”可写为“int a[]={1,2,3,4,5};”。 例912 要定义一个有5个元素的一维数组vect,并使其各元素的初试值依次是30,50,-88,0和0,则下列要定义语句中错误的是( )。[2005年9月 选择第20题]
A.int vect[] = {30,50,-88} B.int vect[] = {30,50,-88,0,0}
C.int vect[5] = {30,50,-88} D.int vect[5] = {30,50,-88,0,0}
答案:A
解析:依据上面的规则,因为有5个元素,A中定义的只有三个元素,因为如果不给出数组的大小,就按照初始化数据的个数来确定其大小,所以A是不符合题目规定5个元素的一维数组,实际上它是3个元素大小;其他几个答案,都是正确的。 例913 要定义数组A,使得其中每个元素的数据依次为:3、9、4、8、0、0、0,错误的定义语句是( )。[2005年4月 选择第11题]
A.int A[] = {3, 9, 4, 8, 0, 0, 0}; B.int A[7] = {3, 9, 4, 8, 0, 0, 0};
C.int A[] = {3, 9, 4, 8}; D.int A[7] = {3, 9, 4, 8};
答案:C 913 考点3:数组的访问和多维数组
数组的访问,是通过数组名[下标]来单独对某个数组元素进行 *** 作。C++中的数组下标是从0开始的,也就是说,比如定义了int a[5],那么其元素分别是a[0]、a[1]、a[2]、a[3]、a[4]。如果下标超过了(因为下标是从0开始的,因此包括等于)数组的大小,就是我们称为的数组越界,是C++里面最常出现的一个问题,在这种情况下程序将挂起或者引起系统死机,是很严重的一个错误,所以程序代码中应该判断下标的合法性,才去对数组元素进行 *** 作。
关于多维数组,大纲要求了解,所以这里简要介绍,关于其细节,读者可以参考这方面的书籍。在实际问题中有很多变量是二维的或多维的,因此C++语言允许构造多维数组。多维数组元素有多个下标,以标识它在数组中的位置。本节只介绍二维数组,多维数组可由二维数组类推得到
char和uint8是可以通用的
而数组名本身就可以做指针用
所以 直接用udp_remote_ip就好了
espconn_sent(pesp_conn, udp_remote_ip, sizeof(udp_remote_ip));
char strs[];//假设已经指向字符内存,也可以写成这样strs(指向指针的指针)
strs[i];//这样的话是取出第i个指针,字符串指针指向的是这个字符串的第一个字符
strs[i];//这样就是取出第i个指针的值
(strs[i]+1);//这样是先将第i个指针向右偏移一位,再取值,也就是取第二个字符
同意楼上,其实指针就是数组的首地址,只不过指针加1的含义是移动数组中数据类型的长度而已,比如char p={‘a’,‘b’,‘c’};假设char占一个字节,若p的地址为0x0000,即‘a’所在的地址为0x0000,那么p+1的地址为0x0001,地址中存储的数据为‘b’,获取方法为(p+1),其他类推。同理若int p={1,2,3};假设int占4个字节,若p的地址为0x0000,即1所在的地址为0x0000,那么p+1的地址为0x0005,地址中存储的数据为2,获取方法为(p+1)。不知这个能否能理解。。。
cout和printf这些函数遇到字符串会自动处理,为了方便程序员,所以你说的两个疑惑都是函数自动处理的结果。
所以建议学习理解过程中先定义中间变量再输出,那样在检验理解上比较明确,当你定义的一个类型无法接受某个值的时候就说明理解错误了,其实我学习研究的时候,遇到疑惑的地方,就设断点跟踪,可以了解内存分配情况以及实际的变量值,包括指针。
另外,对于第二个问题,c是数组指针,是行地址指针,也就是指针的指针,所以(c+1)是取出的是b[1]字符串中第一个字符的地址,类型是char ,是一级指针,每递增一个是一个字符。而c是二级指针,每递增一个,是一个字符串,是b[1]字符串所在地址,类型是char ()[4],虽然他们指向的地址值一样,但是类型不同,当然printf函数会自动处理,所以显示正确。
你可以用以下代码验证
char pp=(c+1);//会报错 ,char ()[4]类型不能初始化char 类型的实体char p=(c+1);//正确
程序功能:主函数声明一个整形二维数组并初始化,子函数display用于显示数组中的元素,display的参数是整形指针。
#include <stdioh>
void display(int p); //显示指针p所指向的内容
int main()
{
int i = 0;
int arr[5][5] = { 10,11,12,13,14,
20,21,22,23,24,
31,32,33,34,35,
41,42,43,44,45,
51,52,53,54,55 };
display(arr[0]); //调用显示函数
return 0;
}
/函数描述:显示数组arr中的元素(按矩阵的形式)/
/参数: p:指向待显示内容的首地址/
/返回值: 空/
void display(int p)
{
int i = 0;
for(i = 0;i < 25;i++)
{
printf("%d ",(p+i));
if((4 == i) || (9 == i) || (14 == i) || (19 == i) || (24 == i))
{
printf("\n");
}
}
}
以上就是关于c++用指针怎么访问多维数组里面的内容全部的内容,包括:c++用指针怎么访问多维数组里面的内容、获取 char数组的指针、c语言指针数组,怎么选中指针数组字符串中各个字符等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)