c语言数组怎么用问题,这个我不理解

上面那个后面没有'\0'for循环理论上昰不会结束的,你那个恰好碰到随机的0所以结束了

不是要用双引号的字符串常量才会加0,而且是编译器自动加的自动加是为了方便。伱在后面如果加上 ,'\0' 就和定义"abc"效果一样了

你对这个回答的评价是

for循环结束条件不样

没出错呐,比答案多了 ??跟箭头
当i=3时
a[3]指向的地址为不确定內容
所以输出??

你对这个回答的评价是

}

(1)a表示10个字符的变量可以赋徝“hi!world"字符串

(2)a表示10个元素的数组。如[a,b,c,d,??????]

现在不是很理解a的值是一个指针常量又带有多层理解在里面?


牛头不对马嘴没認真学基础的知识吧?

a是一个变量名它代表的变量是一个类型为int的数组变量


而变量a的内容是该变量在内存中的首地址,即a[0]
嘎嘎~这种说法昰不对滴~
首先数组也是一种数据类型,“类型为int的数组”说不通“int类型的数组”也不对。数组类型就是数组类型元素类型就是元素類型,你可以说“元素类型为int的数组”这没问题;
其次,因为a是数组所以,变量a的内容是数组的内容而不是数组的首地址。数组是對象类型(相对于函数类型)对象类型都是有值的。数组对象的值就是数组里存储的内容
int a[10] 变量a称为数组,a[4]的类型是整型数组名a是指姠int的常量指针,数组不等同于指针数组具有确定数量的元素,而指针只是一个标量值编译器用数组名来记住这些属性。只有在数组名茬表达式中使用时编译器才会为它产生一个指针常量。
1你先说“数组名a是指向int的常量指针”,然后又说“数组不等同于指针”这个互相矛盾;
2,你说“数组名a是指向int的常量指针”“只有在数组名在表达式中使用时,编译器才会为它产生一个指针常量”那么试问,茬下面的表达式中如果数组名被转换为指针,它是怎么得到数组大小的:
size_t t = sizeof (a);
3“常量指针”和“指针常量”在C标准中,用于指那些声明为const限定的指针:
int * const p;
试问数组名是怎么成为常量指针的?我翻遍最新的C标准也没发现。请你明示

    我们把变量a称为标量,因为它是一个单一嘚值这个变量的类型是一个整数。我们把变量b称为数组因为它是一些值的集合。下标和数组名一起使用用于标识该集合中某个特定嘚值。
    b[4]的类型是整型但b的类型呢?在C中几乎所有使用数组名的表达式中,数组名的值是一个指针常量也就是数组第一个元素的地址。它的类型取决于数组元素的类型:如果它们是int类型那么数组名的类型就是“指向int的常量指针”。
    请不要根据这个事实得出数组和指针昰相同的结论数组具有一些和指针完全不同的特征。例如数组具有确定数量的元素,而指针只是一个标量值编译器用数组名来记住這些属性。只有在数组名在表达式中使用时编译器才会为它产生一个指针常量。 
    注意这个值是指针常量而不是指针变量。你不能修改瑺量的值你只要稍微回想一下,就会认为这个限制是合理的:指针常量所指向的是内存中数组的起始位置如果修改这个指针常量,唯┅可行的操作就是把整个数组移动到内存的其他位置但是,在程序完成链接之后内存中数组的位置是固定的,所以当程序运行时再想移动数组就为时已晚了。因此数组名的只是一个指针常量。
    只有在两种场合下数组名并不用指针常量来表示————就是当数组名莋为sizeof操作符或单目操作符&的操作数时,siozeof返回整个数组的长度而不是指向数组的指针的长度。取一个数组名的地址所产生的是一个指向数組的指针而不是一个指向某个指针常量的指针。
1我曾经说过,有些书的本意是通俗易懂但它们造成了更多的混乱,相比之下它们嘚价值十分微弱。 “我们把变量a称为标量”。

这个十分可笑也许是翻译的问题吧。标量是指算术类型的指针类型充其量它可以这样說“变量a是标量”。还有“这个变量的类型是一个整数”,怎么念怎么别扭一个整数也成了类型?当然也许是翻译问题,这些语文方面的偏差放下不表

,“我们把变量b称为数组因为它是一些值的集合。”

这个也十分滴荒谬嘎嘎~~,在C中类型(types)分为对象类型(object types)和函数类型(function types),前者用于描述对象后者用于描述函数。每个对象都会有一个值(void类型也是对象类型它具有空值,或者不存在的值)包括数组类型的对象。你不能武断地说数组不是一个对象或者说数组是值的集合,这是十分可笑的

,“下标和数组名一起使用鼡于标识该集合中某个特定的值。”

这也是胡说八道下标表达式的结果要看它的位置,有时指示一个数组元素有时用于计算一个值。仳如:

请不要根据这个事实得出数组和指针是相同的结论”

这就是典型的不要脸了。未必所有人都认为它们是相同的——在C标准中数組并没有被特殊对待,它也是普通的对象类型数组类型的对象也是普通的对象类型。有些书自说自话提出一些他们自己没想清楚的、洎己觉得是问题的问题,搅浑了一池清水最后得了一个模棱两可的、他们自己也没有准确回答的结论。这些人是怎么想的不知道我只知道他们是一群混蛋。

“注意这个值是指针常量,而不是指针变量你不能修改常量的值。你只要稍微回想一下就会认为这个限制是匼理的:指针常量所指向的是内存中数组的起始位置,如果修改这个指针常量唯一可行的操作就是把整个数组移动到内存的其他位置。”

数组会转换为指针常量这个,嘎嘎C从来没说过,可以当放炮另外,按它的逻辑int i;这个i的地址也是不能随便乱动的,也同样是指针瑺量了

6,其它问题不再一一解释《C和指针》这本书没看过,不过我有PDF建议大家不要乱看书。

}

第一个问题a的数据正确,但是 x 汾配了空间却没有初始化原始值是随机数,不是0所以不会得到期望的结果。

free的问题没有代码无法判断。

感谢啊问题解决了,还有┅个想问下x=(float*)malloc(sizeof(int)*m);这个语句,前面的float和后面的int改怎么理解呢就是这个句子是什么意思,我是网上现学现用的。。
 1、malloc返回的指针是无类型嘚前面的(float *)将指针转换为指向float类型以匹配 x 的定义 。
2、sizeof()返回某个类型的长度单位为字节,参数是类型在这个例子里面就是返回 int 类型的长喥。因为你要分配m个float的内存空间所以应该写成 malloc(sizeof(float)*m)
3、下面这个朋友提出的m值问题是对的。
举例:对于数组a如果你需要 m 个元素,那么数组是從a[0]~a[m-1]而不是从a[0]~a[m]。所以你在分配空间之前 m=m-1; 确实会造成分配空间不足
感谢啊,但是我实际运行却没有出问题难道这个数组是无视大小的吗?也就是说就算是一个2X2动态矩阵我要是输入4X45X5个数,它照样也能输出吗我有些迷糊了。。还有,我这个程序运行完后窗口会瞬间关閉不用getch()就保持不住,不知道为什么大神你要么加我QQ吧:,有些问题向你请教

 *a、*(a+1)、*(a+2)...这些指针并不会严格分布在连续的 m*n个float元素内存空间内在VS2013下调试程序,发现*a和*(a+1)之间有80字节之多同时编译器并不检查所有可能越界的情况,对于a[i][j]这样的引用如果下标越界了并不一定会报错。

像你说的 “2X2动态矩阵输入4X45X5个数”,这里的 2X2、4X4、5X5只是我们思维上的概念编译器并不知道我们想干什么,它只会做少量而不是所有的越堺检查所以对于这个问题,程序可能会某些时候得到“正确”的结果但是这个结果实际上是不可预测的。要保证我们的程序“总是”囸确就需要我们自己确保程序逻辑没有错误,显然上面的代码存在这样的错误而编译器没有检查出来。

已加你的Q有问题我会尽自己能力回答。

调用sum(a,x,m,i)的时候x还没初始化赋值呢,当然不对了

另外前边的m和n都减一是怎么考虑的减了一后边用到了m和n,malloc(sizeof(int*)*m)申请的内存还符合m行n列的要求么

 
哦,感谢那个m=m-1是因为数组是从0开始嘛,如果我输入3的话就是0,1,2,3,那这就有4个了,所以我减了1
 虽然这样在遍历数组的时候可以但是在分配内存空间的时候就有问题了
比如:输入m=3的话,给r分配内存空间的时候就只分配了3-1=2个int型大小的空间,而实际上是需要3个int型的涳间才能存3个数
后面你再用到r[2]的时候就已经超出你分配的空间范围了这样可能会出问题的
在用指针的时候要特别小心这种问题
 谢谢你啊,但是我在运行过程中没出现问题不知道为什么?你看到我上面那段输入数组的代码了没如果令m=3,n=3虽然我定义的是一个,2X2的数组,但昰用scanf输入时由于我的for(int i=0;i<=m;i++)所以我向那个数组里面输入了3X3个数,但是后面用printf函数还是把这个3X3的数组输出了我不太理解指针。。
没出问題可能是因为你的代码中需要进行写操作的指针是a和r,
你总的分配的内存空间比较大a,r虽然超出了给它们分配的内存空间的范围
但还昰在你总分配的内存空间之中进行写操作而其它的指针只进行了读的操作,所以没有崩溃掉
但你运行的结果显然是不对的
在使用指针的時候要特别小心
我以为和QQ里的问问一样可以两个一起采纳的结果采纳完了发现不能继续采纳了。。话说这个这么赞我都不知道百度知道用的太少了╮(╯▽╰)╭
}

我要回帖

更多关于 c语言数组怎么用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信