C语言基础误区
wssjn1994
这个作者很懒,什么都没留下…
展开
-
C语言对int *a = 0理解的误区
基于我之前对char * str = "abc";的理解,str指向字符串常量“abc”,地址未知。我把int *a = 1;理解成指针a指向常量1,地址未知。其实并不是这样的。int *a = 1;表示指针a的地址为1,可以把它想象成int *a = (int *)0x80000000;不写强制转换符做个试验证明一下。int main(){ int *a = 1; ch...原创 2018-10-11 14:34:22 · 6768 阅读 · 0 评论 -
函数体返回指针的问题
函数体内部的局部变量指针作为返回值返回。分三种情况情况1:指针指向了常量区,参见之前我的一篇文章https://blog.csdn.net/wssjn1994/article/details/83182546情况2:指针指向的空间经过了内存分配,那么外边的变量可以使用这个指针,因为变量定义在了堆上,出了函数也就是出栈之后不会受到影响。情况3:只是定义了局部的指针或者数组,没有分配内存,...原创 2019-08-02 17:28:40 · 280 阅读 · 0 评论 -
多进程操作同一个文件的结果
1.分别调用fopen或open得到的文件描述符不同,而不是第二次open或fopen返回失败2.用不同的文件描述符去读文件,不会共享文件的读index,分别有一个各自的index...原创 2019-06-13 18:55:14 · 1077 阅读 · 0 评论 -
assert用法
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include <assert.h>void assert( int expression ); assert的作用是现计算表达式 expression ,如果其值为假(即为...转载 2019-02-18 15:22:33 · 702 阅读 · 0 评论 -
C语言联合用法
相信学过C语言的程序员对C语言的各种数据类型都非常熟悉,像数组、结构体、结构体数组、结构体指针这些数据类型大家都会信手捏来。然而,有些数据类型被我们不经意的边缘化了。它们没有数组、结构体这些数据类型用的广泛,但是却不容忽视,例如,枚举、联合等。 今天我们就讨论一下union(联合)这个数据类型。C语言的发...转载 2019-02-18 13:28:31 · 917 阅读 · 1 评论 -
怎么能让一个不理解二级指针的人理解二级指针
void swap( int *x , int *y ){ int tmp; tmp = *x; *x = *y; *y = tmp;}int main(){ swap( &a , &b ); printf("a = %d , b = %d\n" , a , b ); return 0;} 函数传参是值传递,所以这就是为什么要实现两个值互换要传指针也...原创 2018-10-19 18:01:56 · 150 阅读 · 1 评论 -
C语言函数返回值的实现方法和误区
实例:你们认为这三个函数能正常返回吗? int func1(int a , int b){ int c = 0; c = a + b; return c;}char * func2(){ char *strTmp = "abs"; return strTmp;}char *func3(){ char buf[] = "qwe"; return buf;}i...原创 2018-10-19 15:12:11 · 4877 阅读 · 2 评论 -
C语言关于结构体大小的问题
C语言结构体若没有特殊定义,大小都是按照结构体中最大的元素为单位来计算的例如typedef struct _A{int a;char b;}A;A结构体大小为8字节若想不按照此规则来定义结构体大小,也就是结构体每个元素占用了多大实际结构体占用大小就是元素的总和的话,则需要在结构体前后加上#pragma pack(push)#pragma pack(1)typ...原创 2018-10-19 10:05:00 · 1537 阅读 · 4 评论 -
C语言volatile关键字的用法
volatile关键字的意义在于让被关键字修饰的变量每次使用时都重新去主内存里读取变量,而不是从高速缓存去读取。int a = 1;普通变量定义之后,若要使用它,都会先把它的值从主内存拷贝到高速缓存中 每次使用都去读高速缓存 运算完毕再把值刷新回主内存这样可以提高效率。但多线程同时工作时线程1int a = 1;a = a + 1;线程2a = ...原创 2018-10-15 11:23:27 · 3827 阅读 · 1 评论 -
C语言sizeof 和 strlen的区别
int main(){ char *a = "12345"; printf("%d , %d , %d\n" , sizeof(a) , sizeof("12345") , strlen(a)); return 0;}输出结果为:4,6,5;sizeof输出的结果带“/0”,strlen不带"\0";...原创 2018-10-12 09:20:49 · 236 阅读 · 0 评论 -
C语言指针定义成int(*p)[]的误区
int (*p)[4];意义是定义一个指针,指向4个int大小的空间。而非定义一个4个int*的数组。所以*p++一次偏移16个字节。int main(){ int (*pp)[4]; int xx[6][4] ={0}; pp = xx; printf("%x\n" , &xx[0][0] ); printf("%x\n" , &xx[2][0] ); pr...原创 2018-10-11 16:09:46 · 677 阅读 · 0 评论 -
C语言指针偏移的误区
int x[6][4],(*p)[4]; p=x; 则*(p+2)指向哪里?A.x[0][2]B.x[2][0]按照我的理解,p是一个int类型的指针,指向x的第一个位置,偏移两次之后指向 x[0][2]。实际上p指向的是一个int型的数组的首地址,指向x[0],偏移一次要加x[6]也就是6个int这么大的空间,所以答案是B...原创 2018-10-11 14:54:14 · 932 阅读 · 0 评论 -
二维数组作为参数传给形参定义为二级指针的函数会发生什么
#include <string.h>#include <stdio.h>#include <stdarg.h>#include <stdlib.h>#include <time.h>#include <ctype.h>#include <unistd.h>#include <fcntl.h&...原创 2019-08-21 09:11:53 · 342 阅读 · 0 评论