
c&c++
Tom098
工作20年的IT老鸟,做过开发,也做过技术支持,丰富操作系统、网络等IT infurstructure 方面实战经验。精通Java/J2EE技术体系以及Linux下用户空间c编程。下一步该如何走? AI、大数据?
展开
-
从汇编语言角度看c程序
全局变量在数据段中,局部变量在栈中。c中的变量名在编译成汇编代码后都对应一个一个汇编的地址 - 偏移地址 + 段寄存器。也就是说c程序编译好后,变量的地址就是确定的 - 都是虚拟地址,MMU会转换成真正物理地址,不用担心不同程序地址冲突问题。所以从汇编的角度看,没有通过变量名来访问变量,都是通过内存地址或寄存器来访问变量,也就是说汇编基本全是指针访问……c的变量名都转化成了地址。这可以解释很多c的现象,比如柔性数组的地址为什么不占用结构体大小数组本身代表一个地址,那这个地址保存在哪里,有原创 2021-05-13 11:54:21 · 388 阅读 · 0 评论 -
c语言柔性数组
放在结构体最后边大小为0不占用结构体空间运行期分配空间时大小任意因为放在结构体最后,所以程序可以算出结构体截止地址,也就是最后一个数组的起始地址,然后由调用程序保证访问该数组时不越界。比如如果是字符串数组,由\0确保字符串结束,如果是其他类型数组,访问时,再额外传一个数组大小的参数下边文章写的比较好https://zhuanlan.zhihu.com/p/94855692...原创 2021-05-13 11:05:52 · 232 阅读 · 0 评论 -
c语言 利用sizeof计算各种类型数据长度
# cat size_test.c#include <stdio.h>int test(int arr[]);int main(void){ char * str1 = "hello"; char str2[] = "hello"; int arr[] = {1,2,3,4,5}; int * a = NULL; int b = 10; a = &b; printf("char * str1 length: %d\n",.原创 2021-05-06 11:38:34 · 1997 阅读 · 0 评论 -
c语言 利用sizeof计算各种类型数据长度
# cat size_test.c#include <stdio.h>int test(int arr[]);int main(void){ char * str1 = "hello"; char str2[] = "hello"; int arr[] = {1,2,3,4,5}; int * a = NULL; int b = 10; a = &b; printf("char * str1 length: %d\n",.原创 2021-05-06 11:36:32 · 1140 阅读 · 0 评论 -
c 语言 字符串和字符数组
字符串常用两种定义方式://方式1: str1指向常量全局变量区,字符串内容无法改变 char * str1 = "hell world!";//方式2: str2是一个数组,存放于栈区,字符串内容可以改变char str2[] = "hell world!";字符数组:char str3[] = {'h','e','l','l',' ','w','o','r','l','d','!'};打印字符串,str1,str2都可以通过printf()打印,但是如果str3通过pr.原创 2021-04-27 15:19:15 · 272 阅读 · 0 评论 -
c语言size_t类型
size_t定义一个值,比如可以用于以下函数://malloc()void *malloc(size_t n);//memcpy()void *memcpy(void *s1, void const *s2, size_t n);//strlen()size_t strlen(char const *s);比如在16位,32位系统中,我们可以将size_t定义成如下类型,这样size_t就表示该系统中可访问内存的最大字节数。typedef unsigned int size_.原创 2021-04-25 11:15:10 · 636 阅读 · 0 评论 -
c语言 struct中的字符串类型成员变量不建议使用char指针定义
比如下面的代码:struct pnames { char * first; char * last;};struct pnames tt;scanf("Please enter the first name: %s", tt.first);scanf("Please enter the last name: %s", tt.last);由于定义了struct pnames类型的变量tt,但是并没有初始化该变量。所以first,last的值有可能会指向内存中的任何区域。后原创 2020-08-26 21:29:16 · 826 阅读 · 0 评论 -
数组,struct, 指针
char数组和char指针都可以作为字符串,比如:char str1[12] = "hello world";char * str2 = "hello world";但是数组是整体作为一个变量。虽然str1表示char 数组的第一个字节的内存地址,但是这个地址并没有单独保存在一个变量中,本身不占用额外的内存空间,也就是说不存在一个内存空间,专门存放str1字符数组的首地址,str1只是标识了整个数组,同时也可以作为一个常量表示保存该数组的内存空间的首地址。而str2作为指针,是单独占用一块内存空原创 2020-08-26 21:15:13 · 240 阅读 · 0 评论 -
c语言中字符串数组与字符串的区别,以及定义字符串的几种方式。
1. 字符串数组与字符串的区别在定义字符串的时候,比如通过如下方式//方式1char str1[] = "Hello world!";编译器实际上是做了两件事:- 定义了一个字符串常量"Hello world!",并将他放在静态存储区,并且这个字符串是以null ('\0')结尾。- 定义一个字符数组,将静态存储区的"Hello world!\0"(包含'\0')复制到字符数组。因为这个字符数据也以'\0'结尾,所以是一个字符串。而定义字符串数组,则没有这样的过程。不存在静态内.原创 2020-08-24 12:40:54 · 1911 阅读 · 0 评论 -
c语言的constant pointer vs pointer to constant
const int* ptr; declaresptra pointer toconst inttype. You can modifyptritself but the object pointed to byptrshall not be modified.const int a = 10;const int* ptr = &a; *ptr = 5; // wrongptr++; // right Whileint * const ptr; ...原创 2020-08-24 11:55:29 · 394 阅读 · 0 评论 -
键盘缓冲区对getchar(),fgets()的影响
在调用getchar(),fgets()的时候,可以一次输入多个字符,超出getcha()或者fgets()的限制。但这些字符会放到键盘缓冲区中,只有在输入回车键的时候,才会通知getchar()或者fgets()来读取缓冲区的内容。但是getchar()一次只能从缓冲区中读一个字符,所以如果你连续执行两个getchar(),在第一个getchar()中输入超过两个字符,在执行第二个getchar()时,他会从缓冲区读取剩余的字符,而不会在屏幕出现光标,给你机会输入新的字符。比如如下代码可以体会键盘缓冲区的原创 2020-08-23 23:11:40 · 313 阅读 · 0 评论