[C语言

 存放变量地址的变量

int a = 1;
int *p;
p = &a;
 
在64位系统中,占用8个字节
 
  • 直接引用
  • 间接引用
*p : 指针指向的变量的值
不要使用未初始化的指针
 
 
1.使用指针实现改变实参值
2.函数返回两个值, 使用指针参数可以改变值的方法
3.不同类型的指针的区别,区分指向的值的长度
 
A.指针与一维数组
1.利用指针读取数组元素
2.利用指针遍历数组元素
指针加减可以操作指针的指向地址
p++, p+1, p+2
根据指针类型,跳转规定长度的地址
 
ps:数组名即数组位地址,不允许使用++自加,因为它是常量,不允许赋值,但是可以进行加减供其他地方使用。
 
使用指针还是数组存储字符串
需要改变字符串:数组
不需要改变字符串:指针 char *p = “abc”
 
数组下标与指针加减
int a[5];
int *p = a;  或 int *p = &a[0];
a[2] ===> p+2;
 
3.指针数组
char *names[5] = {“jack”, “Lucy”, “Sam”, “Tom”, “Cc”};
 
 
 
 
B.指针与函数
1.指向函数的指针
函数名代表函数地址
定义一个指向函数的指针
sample1:
1     //Define a pointer pointting to a function
2     int (*p) (int, int);
3     p = sum;
4     //Call sum by p indirectly
5     p(5,6);
6  
sample2:
    void (*p)();
   
    p = test;
   
    p();//or (*p)();
 
可以把函数当做参数传送
1 int test(int a, int b, (*p)(int int)
2 {
3      return p(a, b);
4 }
 
函数名代表函数的首地址,类似数组
 
 
 
2.返回指针的函数
1 char *test()
2 {
3      return “hello”;
4 }
 
C.指针与指针
指针类型的作用
例如指针加减p+1 p+2 p-1,自增自减p++, p—,需要根据指针类型确定内存偏移位置
int **p;//指向整型指针的指针
 
空指针 void *
p = NULL;
 
 
D.指针与字符串
char name[] = “Simon”; <==字符串变量,数据在栈中
输出效果等价于
char *name = “Simon”; <== 字符串常量,数据在常量区
例如
char *name1 = “Simon”;
char *name2 = “Simon”;
name1 和 name2 指向的实际是同一个常量
    char *name1 = "Tom";
    char *name2 = "Tom";
    printf("name1 addr = %p, name2 addr = %p ", name1, name2);
out:
name1 addr = 0x104d05f6d, name2 addr = 0x104d05f6d
 
指针也能像数组一样访问其中的字符,例如name1[2];
 
 
区别:
使用sizeof的时候,对数组能够得到数组所占用的字节数,而指针得到的是指针占用的字节
字符串数组可以修改字符串,字符串指针不能,只能改变指向 
原文地址:https://www.cnblogs.com/hellovoidworld/p/4087100.html