C语言中的指针(一)

指针也是一种数据类型,占用内存空间,内存中存储的只能是变量的地址。

*p是操作内存的意思,在声明成为指针变量的时候使用*,在使用指针的时候,*表示操作内存。

*p放在等号的左边,相当于是从内存中取值,*p放在内存的右边,相当于是想内存中写值

*就像一把钥匙,通过一个地址,找到一块内存空间,来间接的修改内存中的值。

指针变量和它指向的内存变量是不同的概念。

不断的给指针赋值,相当于不停的改变指针的指向。

修改指针所指向的内存空间的数据,要保证这个内存空间是可以被修改的。举个例子就是修改常量区的内存

指针也是一种数据类型,指针的数据类型指的是它指向内存空间的数据类型。

指针的数据类型决定了指针的步长。

在执行程序的时候,C编译器会提前将所有的变量都分配出来,然后在执行相应的函数调用。

两个指针共享一个内存块,是语言的精华。

C语言中字面常量,也即是0,没有放在堆区中或者是栈中,也就是所谓的宏定义。字面常量是不能取地址的。

间接赋值是指针存在的最大意义,这样就允许了被调用函数操作主调函数中的内存,或者是主调函数可以接受被调用函数分配的内存地址。

间接赋值是指针存在的最大意义。

指针做函数参数 ,可以进行模块的划分。

函数调用时,形参传给实参,用实参取地址,传给形参,在被调用函数里面用*p,来改变实参,把运算结果传出来。这个是指针做函数的精华。

理解指针必须和内存四区概念相结合,分清楚主调函数和被调函数。

指针的输入和输出特性:

输入特性,值得是在主调函数中分配内存,将内存传递给被调用函数,这种用法叫指针的输入。

输出特性,在被调用函数中分配内存,然后供主调用函数使用,或者修改主调函数中的内存。

应用指针必须和函数结合起来使用。

一级指针主要有两种表现,一种是一维数组,另外一种是字符串。

C风格的字符串是以0结尾的字符串,在C语言中,没有字符串这种类型,字符数组模拟字符串。

字符串的内存分配,可以在堆上,可以在栈上,也可以在全局区。

字符数组的初始化:

指定长度的:char buf[100] = {'a','b','c','d'};如果个数大于内存的个数,会编译错误。否则,编译器其他后面的会自动补成0,可以通过打印后面的值来查看是否为0

不指定长度的:char buf[] = {'a','b','c','d'};初始化的个数会由编译器自动生成。由于这个字符串不是以0结尾的,因此,不是一个C风格的字符串。

用字符串来初始化字符数组,字符串后面默认会有一个‘’

char buf[] = "abc";buf中有4个内存,作为字符数组,应该有4个字节,作为字符串应该有3个字节,可以分别通过sizeof和strlen来求得。

char buf[100] = "abc";后面的也会全部都变成0,这些都是编译器的行为。

数组是一种数据类型。只不过是一种复杂的数据类型而已,可以通过sizeof来张量出数据类型所占的内存空间的大小。

中括号和指针之间的关系。数组名表示的是数组元素的首地址,是一个常量指针。目的是为了在析构内存的时候,编译器可以使用这个指针来释放对应的内存资源。

为了能保证局部变量的内存的首地址的安全性,编译器在设计的时候就讲数组首地址设计成为了一个常量。

一级指针的内存模型,最为经常的就是字符串和数组类型。

字符串做函数参数,就是在主调函数中分配内存,在被调用函数中进行字符串的具体处理,比如说查找或者是统计。

++的优先级要高于*的优先级,也就是说++和*都是一种操作,后缀++是先进行其他运算,然后在将其进行++操作

在字符串进行拷贝的时候,一定不要忘记了字符串最后的''。

在进行指针赋值的时候,一定要保证提前分配内存,没有内存,就没有地址,没有地址,就没有指针变量。

多多判断,就是在使用别人传递过来的参数的时候,一定要判断是否满足要求,如果不满足要求就不能往下继续执行,这样才能防止错误数据带来的后续影响。

不要轻易改变形参的值,要引进一个辅助变量,将形参的值给接过来,以后都是通过辅助变量来进行对应的操作。

原文地址:https://www.cnblogs.com/andyniu/p/7633043.html