- 主题:谢谢各位批评,是我混淆了指针和数组名
我弄错了
【 在 ylh0315 的大作中提到: 】
: ret类型不对。
: 应该是size_t ret;
: 多半是long而不是int。
--
FROM 221.218.61.*
啥视频这么坑的?
不成套不成体系的视频?
【 在 sqsl 的大作中提到: 】
: 现在就是照着B站的教学视频在学习呢,有些不懂的地方只好来请教了
:
--
FROM 123.118.191.*
学过谭浩强的书也不会问这样的问题
【 在 sqsl 的大作中提到: 】
: 上午请教各位不定长度数组的生成问题,用各位大拿推荐的malloc函数做成了,但是在求数组长度的时候出现问题了。#incl ...
--
FROM 111.192.240.*
取法乎上,仅得乎中
所以不要看那些不咋样的视频东一榔头西一棒子地学,找点好教材、好视频系统地学
【 在 leizhenyu527 的大作中提到: 】
: 学过谭浩强的书也不会问这样的问题
--
FROM 123.118.191.*
你一个10级用户,混网络怎么也得十年了,怎么才开始入门C语言
【 在 sqsl 的大作中提到: 】
: 上午请教各位不定长度数组的生成问题,用各位大拿推荐的malloc函数做成了,但是在
: 求数组长度的时候出现问题了。
: #include <stdio.h>
: ...................
--
FROM 203.18.50.*
【 在 sqsl 的大作中提到: 】
: 上午请教各位不定长度数组的生成问题,用各位大拿推荐的malloc函数做成了,但是在
: 求数组长度的时候出现问题了。
: #include <stdio.h>
: ...................
主要是你没理解, C语言的指针变量。
L=sizeof(ret)/sizeof(ret[0]);
l=sizeof(*ret)/sizeof(ret[0]);
ret是一个指针, 因为你定义它是int*, 实际它是一个指向int类型的内存地址。
所以 sizeof(ret)实际是取得了一个指针占用的内存宽度, 指针的宽度, 实际上是和系统相关的,
32位的系统, 指针一般是32位, 我们现在家用PC常用的64位系统, 这个值是64位(8个字节)。
在C语言里面, 指针也可以当作数组首地址使用, ret[0], 就是把它当作整型数组的第一个元素,
因为ret是整型指针, 指向的第一个元素类型自然是整型, 所以,这里sizeof(ret[0]) 其实就是sizeof(int).
因为, 你的这个程序可能默认是64位平台的, 无论是int, 还是pointer的长度,都是64位的,
所以才有两次输出都是1.
如果, 你用编译器编译一个16位的程序, 比如,你用虚拟机安装一个DOS系统, 使用古老的c编译器,
指针和int长度就会不一样了。
数组的真实长度是存储长度除以每个元素单位长度,前一个值就是是你调用malloc 传给它的参数。
n*sizeof(int).
int arr[64];
int* p = arr;
虽然, p和arr所指的内存值是一样的, p[3] 和 arr[3] 都可以表示数组的第4个元素值,
但是, 语义是不一样的。 p[3]本质上是把一个指向int的指针越界使用了,但是, 因为指向的这片
地址, 恰恰是一个数组的空间, 而不会发生越界错误。
另外,就是这个sizeof语义差别, sizeof(arr)和 sizeof(p)是不一样的。前者是数组存储长度, 后者是
int 指针长度。
--
FROM 124.126.0.*
谢谢大佬的专业答疑
【 在 poggy 的大作中提到: 】
: 主要是你没理解, C语言的指针变量。
: L=sizeof(ret)/sizeof(ret[0]);
: l=sizeof(*ret)/sizeof(ret[0]);
: ...................
--
FROM 111.193.234.*
谢谢大佬的专业答疑
【 在 poggy 的大作中提到: 】
: 主要是你没理解, C语言的指针变量。
: L=sizeof(ret)/sizeof(ret[0]);
: l=sizeof(*ret)/sizeof(ret[0]);
: ...................
--
FROM 111.193.234.*
“p和arr所指的内存值是一样的”,这句值得推敲
对于编译器来说,指针和数组是两种不同的类型。arr是数组,它是一段地址的别称;而p是指针变量,它里面存的是一个地址,可以是一个连续空间的起始地址。对于编译器,通过指针或数组+偏移量访问内存,有些许的区别
【 在 poggy 的大作中提到: 】
:
: 主要是你没理解, C语言的指针变量。
: L=sizeof(ret)/sizeof(ret[0]);
: ...................
--
FROM 119.114.255.*
简单的说,你的arr不指向地址,编译器绝不允许你改变arr的地址,例如arr=p
【 在 poggy 的大作中提到: 】
:
: 主要是你没理解, C语言的指针变量。
: L=sizeof(ret)/sizeof(ret[0]);
: ...................
--
FROM 119.114.255.*