10163|33

2453

帖子

19

TA的资源

五彩晶圆(中级)

楼主
 

C语言数组的疑问,有请辛昕和其他网友一同来讨论 [复制链接]

之前有网友发了《 c语言中数组初始化要用static ?求解释..》的帖子。问题源于一组PPT,但是PPT只是蜻蜓点水,刚好我有凌明老师的这本书,PPT也是上课的幻灯片,书是教材,很搭。于是我就又重新阅读了相关章节。有疑问,我给凌明老师发了邮件,一直没有收到回复。现在我把问题贴出来,一起探讨:

在C语言编程中,数组变量的大小必须确定(如果是数组常量会被分配到CODE区),常见的是#definde N 10和temp[N]的配合,但是初学C语言的时候,觉得这样太不灵活,于是响了很多办法来定义大小可变的数组,无一例外都失败了。后来了解到数组必须是静态了,意味着在编译的时候,数组就已经分配好了,而不是等到运行时候才分配,如果是这样就解释了,寻求大小可变数组的办法靠定义数组这样的数据类型是必然失败的。要定义可变大小的数组,也就是动态数组,要靠malloc来申请一段内存来做“数组”。于是在函数内定义局部变量类型的数组就有问题了,是在堆栈区,还是在静态存储区?如果是堆栈区,那么数组就不再“静态”了,与C标准相左了。那么如果是静态存储区,如果执行10次调用子函数,就会申请10倍的空间,想想也是可怕的,C语言不会那么傻。难道在函数里定义数组用不用static来修饰,效果都是一样的??

我把我发的邮件也贴出来,大家一起来帮我解答。
=-=-=-=-=-=-=-=-=-=-=-
凌教授你好,读了你的《高级C语言编程》一书感触很多,其中有一处不明,特来请教。书中第116页讲到C语言只支持静态数组,是否是讲,无论是在函数体外还是main函数里还是子函数里定义的数组型变量都保存到了内存的非堆栈区域,也就是说这个时候(在函数体内定义数组)用不用static修饰得到的效果都跟有static的效果一样,在编译的时候就可以分配好内存空间?在书中第128页最下面,讲到了一个字符型数组的例子,在函数里定义的字符型数组被分配到了堆栈区域。字符型数组如果可以理解成数据类型是字符型的数组,那么前面两处就矛盾了?
还有一个问题是这样的“c语言规定,只有静态存储数组才能初始化,静态存储数组要用static定义,为什么谭浩强的书在定义字符数组时从来不用static,而是直接赋值?”网上有解答是这样的:
ANSI/ISO C之前,对数组的一次性初始化必须要求数组被声明为静态的,楼上说static和extern与变量使用范围有关,没错,但不是这里要使用的含义,这里静态(全局变量默认为静态的)指的是该变量只初始化一次。全局变量肯定是只初始化一次的,所以这主要是针对函数块里面声明的变量来说的,就是说在函数块里面声明的静态局部变量,只在第一次进入这个函数块的时候才进行初始化。ANSI/ISO C允许对声明的非静态数组也进行一次性初始化。所以在支持ANSI/ISO C标准的编译环境下,函数块内写
static int a[3] = { 2, 4, 5 };

int a[3] = { 2, 4, 5 };
都对。
函数块外面写static时才是楼上所说的变量的适用范围,不加static声明出来的变量的范围可以在文件之间,加了static声明的变量则只在该文件内。但此时,你加不加static都不会影响你写int a[3] = { 2, 4, 5 };因为这个时候a是全局变量,默认的是静态的,这样的初始化当然没有问题的。

另外,这种一次性初始化必须在定义一个变量的时候才是允许的。这一点,楼主要谨记,不管是ANSI/ISO C还是C99都是不允许出现
int a[3];
a[3] = { 2, 4 , 5 }
的,不管有没有static修饰。如果你不想在定义的时候初始化,那就只有等到你需要的时候通过赋值操作来进行,数组当然得通过循环



=-=-=-=-=-=-=-=-=-=-=
对于上面的解释是否正确?能不能请您在解释一下这个问题。谢谢!
此帖出自编程基础论坛

最新回复

有机会好好整理一下吧............5年前我很多地方还没理解到位......  详情 回复 发表于 2017-1-29 14:59
点赞 关注(2)
 

回复
举报

7815

帖子

57

TA的资源

裸片初长成(中级)

沙发
 
不至于被点名吧......
好吧,反正我也很久没怎么看新帖子了......

开玩笑的,应该说,谢谢楼主点名
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

板凳
 
我都给忘了,上次盼盼的帖子,我还没看 那个PPT,现在一并看了........
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

4
 
刚看了看你们说的 凌明 的那个 C语言讲义 的第二章,其实,发现有好些内容,颇值得商榷来着。

首先是 在C语言诞生以前,大多数程序是由 汇编语言 编写的。

事实上,我一直模模糊糊记得,C语言是比较晚出现的一门中高级语言,于是百度了一下,果断没错,像fortran和早期的商业语言cobol,还有PASCAL。
C语言出现于1970s没错,上面提到的 前两种比C分别早了2个和1个十年,至于PASCAL,刚查了一下,它也出现于1960s,而以上这些,和C一样都是 结构化面向过程的编程语言。

C语言,是 K&R 两位老先生 在总结 一个 失败了的软件工程项目 后 无意发展起来的。
K&R也是C的最早标准,后来ANSI C标准化大概是在1985年完成,后来还出现了C99标准,那就是更后的。

额,可以把这个当成 趣谈,其实,和问题没太大意义。
不过,各类语言在各自的发展过程中往往受到各自的启发,我想,假如,在C和汇编语言之间没有这么几种语言的广泛使用和启发,C语言大概也不会是这个样子——
我的意思是,它会更加像 之前提到的 fortran pascal cobol中的一种。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

5
 
C语言的特点

其中有一些特点,其实也说不上什么特点:
1 比如说 具有结构化的控制语句。

我接触过的语言不多,不过,就我接触过的pascal,我就敢肯定,这门语言和C其实极其相似,三大控制结构:顺序结构 条件结构 循环结构 一个不缺,只是可能内部实现和具体的语法不一样。

最近接触的比较新的javascript,我意外地发现这门语言在语法上都和C语言的这些控制结构几乎一模一样。

而且,我相信,这三种基本的控制结构大概是所有语言都会具备的。
所以,说不上什么特点。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

6
 
好吧,前面的两个,说起来有点吹毛求疵,如果凌明老师看到了,请原谅,不要打我~~~

现在,我们来说说 这个核心问题,首先我想说的是, 如果没有特定的上下文,这句话是毫无疑问地错误。
另外就是,我仔细看了看上下文,应该说,在这个特定的语境下,这个做法并不会有错误,但这个说法本身很有问题,于是就出现了很大的误导性,于是就有了 盼盼 这个帖子的疑问。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

7
 
现在我把这部分内容全部 打出来 先
字符串的表示形式
c中字符串有两种表示形式:一种是数组,一种是字符指针;
char string[] = "I love c!";
char *str = "I love C!";
其实指针形式也是在内存中开辟了一个数组,只不过数组的首地址存放在字符指针变量str中,千万不要认为str是一个字符串变量。
2 字符串指针做函数指针,实际上 字符串指针就是 数组的首地址。
3 字符指针变量与字符数组的区别
字符数组由若干元素组成,每个元素存放一个字符,而字符指针变量只存放字符串的首地址,不是整个字符串
对数组初始化要用static,对指针变量不用;
对字符数组赋值,只能对各个元素赋值,不能像下面这样
char str[14];
str = "I love C!";
对指针变量可以
char *str;
str = "I love C!";
注意:此时赋给str的不是字符,而是字符串首地址。


首先我想说,当我真的把这一字一句全部打出来的过程里,我可以得出结论,这句话完全错误,即使在这个语境里。
下面我会详细对这段话出现的一些概念上的错误 一一说明。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

8
 
第一点,也是整个问题出现的根本原因:

“I love C!”;
这个东西到底是什么?

按照PPT的说法,它被解释为 “在内存中开辟了一个数组”。

要解释一个有点奇怪的说法很费劲,我干脆直接解释好了。

在C代码里写一句 “I love C!”
这个东西实际上被称为 常量字符。
它既不是变量(也就不会是数组了,因为数组本身就是一种变量。)

存储时,它大概会被分配在和 全局变量,静态变量 附近的区域,这块区域经常就被叫做 常量数据区,它存储的不仅是这类 常量字符,还包括一些变量的初始化值。
比如说,我们定义了一个全局或者静态变量,并且初始化为0;
static int a = 0;
它和定义局部变量
int a = 0; 在编译和运行时发生的行为是不一样的。

具体说,静态变量(在编译时,分配存储空间时,它和全局变量的规则几乎是一样的。)
静态变量在编译时(注意是编译时,而不是运行时),就已经由编译器为它分配好一个内存空间地址,它将永久占有这个内存空间。这些空间,也就是常被我们称为的 全局数据区 的 空间,它们不会在 程序运行过程中,发生销毁和创建过程。

而局部变量,它是在程序运行过程中,由函数调用时发生的分配行为,它所占用的内存空间被称为 堆栈区(实际上 堆 和 栈 是两个不同区域,但这个细节实在细了点,我也分不太清楚,在这个问题中意义不大,我们暂且视为一回事。)
堆栈区是在用到时(比如函数发生调用)临时分配,在不用时(离开函数)自动销毁的一个空间。

然后,说回 初始化的问题。

我们初始化一个局部变量,实际上在实现时,相当于在我们进入该函数之际,首先对这个(刚刚分配在堆栈上的空间)进行赋值,这个行为和我们写一句赋值语句没有任何区别。

也就是说
int a = 0;

和 int a;
a = 0;
没有任何区别。
那个0作为代码的一部分 存在 代码块的内存空间里。

但是,对于 全局 静态 变量呢,事情就有点不一样了。
因为,初始化的全局变量,它在编译时就已经完成了,它不需要任何额外的语句赋值。
那么,我们定义变量时,首先就要分配对应的空间,然后用名字记录它的地址,那么它的初始化值存储在哪里呢?
是的,就是存储在 常量区里。

作为这个话题,我们关注的是 字符串常量。
它就是存储在 这样的一片固定区域里,而它对外提供的只是这片区域的首地址。
简单地说,就是说,
“I love C”
这个字符串只能作为一个地址来用,并且是一个固定了的地址。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

9
 
接下来我要解释一个很关键的概念,这也是 数组 和 指针 的一个重要区别

如我在盼盼的那个贴里说的话:

定义数组 和 定义指针 对于 内存开辟空间 是不同的行为:

定义数组时,已经按照你的要求(隐式或者显式)分配好了 内存空间。
而定义指针,这个行为本身,只是定义了一个地址变量——就是说,指向那个地址而已,至于那个地址后边跟着的空间,是没有发生分配行为的。


更具体地说,我们定义一个数组,内存将分配一个空间,然后把这个空间的地址命名为 该数组的名字,也就是说

char ss[3];
这将分配一个3字节的空间,然后它的地址假如是0x3423,那么,以后,将我们把数组作为 左值 赋值 时,它就意味着 0x3423.
ss = 。。。。。
相当于
0x3423 = 。。。。。

要记住的是,既然已经分配好了,那么这个地址是不会改变的,是固定的。

而 指针呢?
情况不一样,关于指针是什么,他没有说错,指针是存储地址的变量。

既然是变量,也就是说,它存储的 地址值 是可以变的。
它既可用来存储上面那个ss的地址0x3423,它当然也可以存储我存储在 常量区 里的“I love C”这段内存空间的首地址。

哈哈,看到了没,实际上,这里已经解释了 那句话的意思
char *str = “I love C”;
在C语言里,赋值号(不是等号)的两边被称为 左值 和 右值,同一个变量作为 左值和右值,其意义是相差很大的,当然这个细节很细,这里,我只简单的提一个 大概的 概念:
作为 左值时,它经常表现为它的地址,对应的是它的内存空间,而作为右值时,它经常作为的是一个具体数值。

一个简单的例子就是
a = 4;
b = a;
在第一个式子里,a是左值,其实它表示的是存储a的存储空间,而4是一个具体的数值。
所以第一句,我们可以具体的理解为,把4这个数值存储在a的空间里。
第二句,a 是右值,把它赋给b,我们可以理解为把a存储的数值赋到b的空间里。

char *str = “I love C”;
所以,这句话的意思,其实是
str是一个地址,不要因为 定义时要写一个*号表示为定义变量 而 把 *错误理解为 这个地址的引用符,所以,我该这样写,就更加不带歧义。

char *str;
str = "I love C";
这两个写法是完全等效的。

str是一个 指针空间,通俗的说,就是一个 存储着一个 地址值 的 空间。现在,空间里存储的 这个数值 被赋值 为 这个常量字符串 的地址。

这话说的有点拗口。
或许我假设一个具体数值,就会更好理解吧。

a = 4;
b = a;
我们假定 a 的地址为 0x4544;
b的地址是 0x4545;
那么,,a = 4; 执行后,相当于 0x4544这个空间 的 内存单元 存储了 4 这个 数值;
b = a;这就等于说,0x4545这个空间现在存储的内容和a一样,也是4这个数值。


char *str;
str = "I love C";

在编译时,“I love C”被分配到地址 0x1233;
现在 str 这个指针变量的地址 本身可能是 0x6766;
那么,经过第二句赋值,我们 将得到的结果是
0x6766的内存单元里 存储的 数值为 0x1233;

最后,我要特别强调的一件事是:
与 定义数组不一样,定义指针时——假如我们不初始化它。
那么,这个时候,仅仅是为 存储 那个地址值分配了一个 空间,这空间仅仅用来存储 地址值的,就是 前面说的 那个0x6766内存单元。
但是,对于这个指针所引用的这个地址,它本身没分配任何内存给这个地址用,用代码更好说明。

char ss[4];
我们已经有了ss地址后的四个字节空间,可以用来存储东西;
但是
char *ss;
我们除了拥有ss这个 可以用来存储一个 char型变量地址的 指针值以外,我们绝对不能 直接 直接使用这个地址后面的空间。

比如 *(ss + 3) = 3;
这个程序运行,立马就会 发生 内存读写错误。

但是,如果,我们 给这个指针赋值,那么,它就拥有了 那个 赋值的 地址 后面的 内存空间,可以直接使用.

char *ss = "I love C!";

额,其实,这部分,想了想,可以更简单的说。
如果不对一个指针进行初始化,它就会指向一个不明确的内存空间,而这些区域可能是不允许使用的,所以,如果你就此就对它进行读写,就会发生 内存读写错误。

而如果你已经给它初始化了 一个 地址值,那它就很明确的知道自己指向了那片内存空间,对它进行地址运算就不会报错。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

10
 
好吧,这个问题真的很难解释清楚。

简单地说,数组 编译时已经分配好了对应的内存空间——只有先分配好空间,才允许使用这些空间进行读写操作。然后,返回给 数组名的 是这片空间的起始地址。

对于 指针,它只是用来存储 地址的,而这个指针的定义本身,不会对那个地址后面的空间发生分配动作,所以不能直接使用。
但是,如果你用一个 具体的地址值(实际上,一个拥有了地址值的 东西——它可能是 一个变量的地址,也可以是一个分配好了的数组名),它就意味着已经发生了开辟内存空间的行为。
用它去给指针去赋值,等于用这个指针 指向 一片已经分配好空间的 内存区域,自然就可以使用了。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

11
 
现在回到 那个问题
为什么 对于(字符串)数组初始化一定要 static?

其实,我们找不到任何理由支持这个理由。

static一个数组,仅仅只是意味着,这个数组被存储在静态区,仅仅意味着,它不会在每次进入这个函数时,要重新分配这个空间(在堆栈上),也意味着,它不需要每次都被重新赋值。

当然,对于 一个 字符串 而言,假如这个字符串本身是不经常被改变的,这样做,的确可以减少不必要的 分配 和 赋值 动作,让程序运行的更加高效。

但,除去这个理由,这个说法,完全没有理由。

事实上,如果要存储一个 不变的 常量字符串,我一定不会用数组,我还不如用 一个 宏 定义,用 宏定义 记录这个常量字符串的 地址。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

12
 
现在,,回到 这个帖子本身。。。。。。

首先,你提到一句 C语言只支持 静态数组。

我想说的是,你大概误解了这个 静态 的意思。
你肯定是把 静态数组 和 静态变量型数组 混为一谈了。

关于 局部数组 和 静态数组 的区别,和 局部变量 和 静态变量 的 是一回事。

这个地方说的这个 静态数组,实际上,是针对于 C++等语言里的 动态数组 的 概念的。

这一部分,因为对于C++我没有怎么写过程序,我并不十分理解其中的细节。

但是有一点很清楚,那就是,,这个 静态数组 指的是 在定义时,只能固定指定数组的长度,所以,在C里,我们不能拿一个变量去定义一个数组的长度就是这个道理。

而 C++里的定义数组,是支持 变长度的。
对此,我一点不理解为什么可以如此。
但我认为,它是利用New这个操作不知如何实现了 类似于 C语言里的 malloc等函数 给一个地址动态分配内存 的 功能。

这里的 静态 和 我们说的 静态存储 完全是两码事。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

13
 
关于你的第一个问题,我有点被你绕晕了,希望我啰啰嗦嗦写了这么多,能让你搞清楚问题所在,如果还是没搞明白,再讨论吧。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

14
 
还有一个问题是这样的“c语言规定,只有静态存储数组才能初始化,静态存储数组要用static定义,为什么谭浩强的书在定义字符数组时从来不用static,而是直接赋值?”网上有解答是这样的:
谭浩强从来直接赋值,呵呵,你可以自己试试呗,虽然 老谭 的书毛病不少,不过,至少这个位置他是没错的。
说真的,我也不知道,C语言“规定”哪里规定了 初始化必须用 静态 数组。


ANSI/ISO C之前,对数组的一次性初始化必须要求数组被声明为静态的,
这句话,这位老兄,他犯的错误是 把 因果搞反了。
并不是 对数组的一次性初始化要求数组被声明为 静态的。
而是,如果只想初始化一次数组,就必须把这个数组定义为 静态的,理由,我已经说了。
因为 局部数组(实际上这里,对于数组和对于变量都是一样的),每次调用函数时都会被创建和初始化。
至于 数组或者变量 的 定义 和声明的概念么,我提提就算了。
不要随便混淆 定义 和 声明 这两个概念,就像函数声明和函数定义 不是一回事一样。
举个简单的例子,我在一个源文件里,定义一个全局变量 int a;
然后在另一个源文件我要使用这个全局变量,我就需要 外部声明它  extern int a;
这里,我似乎是在 扣字眼?
嘿嘿,你可以试一下这件事。

定义 int a;
声明 extern short a;
然后,你可以看看 ,这个a到底是int型还是short型。
提示:这个问题的关键在于,,定义包含了 内存分配动作,而声明,仅仅只是引用 而已。


楼上说static和extern与变量的使用范围有关,没错,但不是这里要使用的含义,这里静态(全局变量默认为静态的)指的是该变量只初始化一次。全局变量肯定是只初始化一次的,所以这主要是针对函数块里面声明的变量来说的,就是说在函数块里面声明的静态局部变量,只在第一次进入这个函数块的时候才进行初始化。ANSI/ISO C允许对声明的非静态数组也进行一次性初始化。所以在支持ANSI/ISO C标准的编译环境下,函数块内写

下面的我就懒得多写了
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

15
 
写的我有点晕。
那位老兄,比起 书 对了一步。

我是说,他知道怎么回事,但他的理解也是乱七八糟。

不过我实在看得有点晕,不知怎么往下解释。

楼主你先看看我写的部分内容,再有问题,咱接着说。


另外,我觉得你有必要补充一下几个知识点,回头好好找本正儿八经的书看看。

一个是 变量 的 作用域 和 生存期。
提示是
针对 作用域 有两部分的内容:
一个是 局部 和 全局
另一个是  源文件级别的全局变量, 和 源文件之间可以外部引用的 全局变量。

至于生存期没啥好说的。

你只要能分清 子函数内部的 局部变量 和 全局变量 的数据 能存在多久就OK了。

不过,要说明白也真不是个容易的事情,诶,,本来打算12点老老实实睡觉的,结果倒好,都1点多了........

再次强烈推荐,看C语言要多看一些书,我个人强烈建议看老外的书,人家写的系统,明明白白。


PS:这些都是基础。
说句难听点的话,也难怪你们分不清状况,教材上都写得这么乱七八糟,怨不得你们。别的不多说了。

[ 本帖最后由 辛昕 于 2012-8-16 01:04 编辑 ]
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

76

帖子

0

TA的资源

一粒金砂(高级)

16
 

回复 15楼 辛昕 的帖子


你真的好认真啊 我一个字不落的看完了 说实话有点小感动...哎,最近真的被各种资料弄得乱乱的,看到一种说法,觉得有道理,看到另一种又觉得也有道理...不知道该怎么办了都...你的最后一段点醒我了,对,应该先找一本好的教材从头开始。嘿嘿...所以我来求建议了...看到好多老外写的比如说《The C Programming language》《C primer》《Expert C programming》《C与指针》等等好多,像我这样大一学过了C++,但是基础不牢的小白,先拣哪本书开始比较好啊,或者说怎么个阅读顺序比较合适呢...我觉得我没办法一口气全部都看完耶...

[ 本帖最后由 blue_bm 于 2012-8-16 19:58 编辑 ]
此帖出自编程基础论坛
 
个人签名上善若水 顺其自然
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

17
 
俺一向只推荐一本,适合入门
C语言入门经典 美国老头子 Ivor Horton写的
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

18
 

回复 16楼 blue_bm 的帖子

其实这个帖子里的内容,已经超出了 入门 的 概念了。
像 变量 和 函数 的机器码会存储在什么位置。

这玩意,是我有一次在操作内存时,碰上一堆麻烦,看 深入了解计算机原理  那本书时才看到的。

这个,对你们来说,呵呵,是有点晕乎其晕的........

我为了说明白,也费了不少劲.......

话说回来,学C语言,如果能理解到 内存和存储 这个地步,,基本上,基本语法对你来说就没啥意思了......

接下去就可以玩点别的拉,就像我现在,这些玩意都没啥意思了,现在看的 是 代码大全 编程匠艺 一类的书。

不过,如果学C,这一关最好还是过一过......
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

76

帖子

0

TA的资源

一粒金砂(高级)

19
 

回复 18楼 辛昕 的帖子

好吧...其实我有那本书,但是嫌太厚了一直都木有看...呼,回学校搬出来看好了....
我是学电子信息的,以后想做嵌入式~现在在学51呢,所以想打打c语言的底子~~
那个...我能问一下你在做什么工作吗?程序员?感觉你c语言好厉害的样子啊
此帖出自编程基础论坛
 
个人签名上善若水 顺其自然
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

20
 

回复 19楼 blue_bm 的帖子

一个只会C语言的 单片机程序员.......

没这点本事,能有饭吃么,亲?
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表