c语言指针学习笔记

指针

1.运算符 &
  1. 作用:获得变量的地址,操作数必须为变量。
  2. 地址的大小是否与int相同取决于编译器。32位是4字节,64位是8字节。
  3. 因此地址的输出不能是%x, 应该是%p。
2.指针
  • 就是保存地址的变量
int i;
int* p = &i;
int* p,q;
int *p,q;
  • 这里p是指针变量,里面放的是i的地址,指向i。
  • 注意以上3、4表达等价,*是加在p上的,p是指针变量,q只是普通变量。
3.指针作函参
  1. 作用:将一个变量的地址传入函数,在函数里面就具有了访问函数外部这个变量的能力。
  2. 访问这个地址上的变量需要使用到单目运算符*,接着可以通过指针使用和改写这个变量。
int i = 10;
f(&i);
void f(int *p)
{
    
    
   int k = *p;
   *p = k+1;
}

最终k = 10, i = 11

  • p内部储存的是变量i的地址,而*p就是i,两者等价。
4.指针的应用
  1. 场景一:函数需要返回多个值,某些只能通过指针返回。传入的参数实际上是需要保存带回的结果的变量。如交换两者的值:
int a = 5;
int b = 6;
void swap(int *pa, int *pb)
{
    
    
    int t = *pa;
    *pa = *pb;
    *pb = t;
}
  1. 场景二:分开返回。函数返回运算的状态,结果通过指针返回。
5.指针中的常见错误
  • 定义指针变量,还没有指向任何变量就开始使用。
6.指针与数组
  • 数组名是特殊的指针,代表了数组的首地址,无需用&取地址。
  • 但是数组单元表达的是变量,要用&取地址。
  • [ ]运算符可以对数组做,也可以对指针做。
  • *运算符可以对指针做,也可以对数组做。
  • 数组变量是const的指针,所以不能被赋值。

int a[ ] <==>int * const a


int a[5], b[5];
a = b;
// 这是不能实现的

7.指针与const
  • const在这里的作用有两种。
  1. 指针是const,表示指针一旦得到某个变量的地址后不能再指向其他变量。可以理解为不能再改变指针p的值,但可以改变*p的值。

int* const q = &i; // q是const
*q = 26; // ok
q++; // error

  1. *p是const,表示不能通过这个去修改所指的变量。注意在这里指针和指向变量都不是const。

const int *p = &i;
*p = 26; // error (*p是const)
i = 26; // ok
p = &j; // ok

  • 所以写法只有两种,看const在*的前面还是后面。要么是指针不可修改,要么是通过指针不可修改。

int *const p1 = &i;


const int *p1 = &i;
int const *p1 = &i;

  • 总是可以把一个非const的值转换成const的。

void f(const int *x)
这样既能用较少的字节数传递值给参数,又能避免函数对外面的变量的修改

8.指针运算
  • 指针能进行的运算:+,-,+=,-=,++,- - 。
  • 还能两个指针间相减,相减的结果是除了sizeof的,得到两者的间隔。
  • 给指针加一,并不是真正地去加一,而是加上指针类型的sizeof,往下移动一个单元。
  • *p++的意思是取出所指变量的数据,再把p一到下一个位置上去。
9.指针比较
  • <, <=, ==, >, >=, !=都可以对指针做。
10.指针的类型
  • 无论指向什么类型,所有指针的大小都是一样的,因为都是地址。
  • 指向不同类型的指针是不能直接互相赋值的。这是为了避免用错指针。
11.动态内存分配
  • 当输入数据时,如果数据个数是变量,在C99可以用变量做数组定义的大小,另外还可以使用动态内存分配。
  • 使用时需要包含头文件<stdlib.h>,形式如下:
int *a = (int*)malloc(n*sizeof(int);

n为数据个数(数组大小),这里是以字节为单位来分配空间的,a可以当做数组来用。

  • malloc函数
  1. 头文件#include <stdlib.h>
  2. void* malloc(size_t size),因为返回类型为void*,所以要加上相应的类型强制转换。
  3. 申请的空间是以字节为单位的。
  4. 在申请完空间之后要释放。
free (a); 
  • free函数
  1. 把申请的空间还给系统,与malloc一起使用。
  2. 只能还申请来的空间的首地址。

猜你喜欢

转载自blog.csdn.net/weixin_45688536/article/details/104193729