欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c语言学习记录

程序员文章站 2022-07-15 09:05:05
...

知识点小记:

  • 1.硬件也是通过地址访问内存位置。
  • 2.C并不具备显式的布尔类型,其使用整数来代替,规则是,零是假,任何非零值皆为真。
  • 3.值的类型并非值本身所固有的一种特性,而是取决于它的使用方式。

在某个数组中查找某个特定值,一种较安全的策略是让函数返回俩个独立的值:首先是个状态值,用于提示查找是否成功,其次是个指针,当状态值提示查找成功时,它所指向的就是查找到的元素。

动态内存分配函数

malloc:   需要手动计算内存空间的大小,一个参数  void *malloc(unsigned int num_bytes); 不会对分配的空间进行初始化,里面为随机值,效率更高。

calloc:不需要手动计算内存空间的大小,两个参数  void *calloc(size_t n, size_t size);会对分配的空间进行初始化,初始值为0.

realloc函数和上面两个有本质的区别,其原型void* realloc(void *ptr, size_t new_Size)

如果size较小,原来申请的动态内存后面还有空余内存,系统将直接在原内存空间后面扩容,并返回原动态空间基地址;如果size较大,原来申请的空间后面没有足够大的空间扩容,系统将重新申请一块(new_Size)的内存,并把原来空间的内容拷贝过去,原来空间free;如果size非常大,系统内存申请失败,返回NULL,原来的内存不会释放。注意:如果扩容后的内存空间较原空间小,将会出现数据丢失,如果直接realloc(p, 0);相当于free(p).

指针作为函数的返回值(返回值类型是指针的函数)

不过需要注意的是,返回的指针不应该指向函数的局部变量,因为局部变量只在函数这一次被调用期间有效,如果返回了指向局部变量的指针,又在之后的程序中访问了这个指针所指的内容,就会访问越界,可能会引发程序异常.

int* Ret()
{
int a = 10;//局部变量
return &a;
}
int main()
{
int *ptr = Ret();
cout << *ptr << endl; //访问越界
*ptr = 0; //写内存也是访问越界
}

 只能返回全局变量或者静态变量的地址,返回实参的地址,其他情况可能引发错误,谨慎使用。

变量的作用域

变量可以起作用的范围。

局部变量:只能作用在它所定义的局部。

全局变量:定义在所有函数外部的变量,可以作用在整个程序中。

形参变量 :被看作是函数内部的局部变量。

当局部变量和全局变量同名的时候,在局部,只能访问到局部变量

变量的生存期,变量是有生命的

1)静态生存期 :生命时间就是整个程序的时间。全局变量。

2)动态生存期 :当语句运行到定义变量的语句的时候诞生,作用域结束处消亡。普通的局部变量。

特殊情况

1)用static修饰局部变量 :会将局部变量的生存期改为静态生存期

2)用static修饰全局变量 :限制全局变量只能在它所在的源代码文件中使用