C指针为何物?灵魂乎。。。
俺的理解为:地址加上内存的操作方式。
呵呵、菜来喽
定义一个指针
存储数据类型 数据类型 * 指针变量名;
int * b;
int a = 0x12345678;
b = &a;
char *c = (char *)&a;
指针变量b的类型为 int*
指针变量b的值为 &a
指针变量b所指向的类型为 int
若在32位机上:int占4个字节,char占1个字节(设机器为小端存储模式)
注:小端存储为内存的低地址存储数据的低位数据
指针变量b操作内存的区域为,以&a为基地址,偏移4个字节,既&a+4;
*b == 0x12345678;
指针变量c操作内存的区域为,以&a为基地址,偏移1个字节,既&a+1;
*c == 0x78;
指针的赋值
类型匹配:指针指向的是什么类型,就得用什么类型的地址赋值给指针
int *a,**b,***c,d,*k;
d = 9;
a = &d;
k = a;
b = &k;
c = &b;
/**
*二级指针:
**/
int i = 10;
int *p , **q;
p = &i;
q = &p;
i == *p == **q;
*q == p == &i;
//可以通过二级指针改变一级指针的指向
/**
*指向字符串的指针:
**/
char *p = "hello";//p只保存了字符串常量区的字符串“hello”的地址,所以不能通过p去修改“hello的值”
/**
*指向数组的指针:
**/
char a[6] = "hello"; //a == &a[0]
char *p = a;
//p[0] == a[0] == *(p + 0) == *(a + 0)
/**
*指针四则运算:
**/
int *p;
int a[4] = {1,2,3,4};
p = a;
//(p+1)表达式的值为 2;既*(p+1),没有改变p的值
//p++ 表达式的值不变,p指向下一个元素
//p+n 跨越了n * sizeof(p所指向的类型)个字节
//两个指针相加:没有实际意义
//两个指针相减:算出两个指针的空间之间有多少个指针指向的数据类型空间
int *q,*p;
int a[20];
p = a;
q = &a[19];
//q - p == 19;
指针数组:本质上是数组,数组的元素是指针
存储类型 数据类型* 数组名[下标];
char *p[4] = {"welcome","to","CLanguage""world"};
//*(p[0]) == "welcome";
//*(p[1]) == "to";
//*(p[2]) == "CLanguage";
//*(p[3]) == "world";
char a[6] = "hello";
char b[6] = "world";
char *q[2] = {a,b};
数组指针:本质上是指针,指向的类型为数组
存储类型 数据类型 (*指针变量名)[下标]
char (*p)[5];
char a[5] = "hello";
p = &a;//*p == a == `h`;
/**
*指向二维数组的指针
**/
int a[2][3];
int (*p)[2][3] = &a;
int (*q)[3] = a;//&a[0]
int *p = a[0];//&a[0][0]
/**
*指针强制类型转换:
**/
int i = 258;
char j = (char)i;
int a = 1999;
int *p = &a;
char *q = (char *)&a;//*q == *(char *)p;
void类型指针
void类型的指针可以接收任意类型的指针,但是使用的
时候需要强制类型转换
void类型:
void不能用于修饰普通变量;
void能用于说明函数的返回值和函数的入口参数
void可以用来修饰指针,但是使用时必须强制类型转换
#include <stdio.h>
int main()
{
int i = 258;
void *p = &i;
printf("%d\n",*((int *)p));
printf("%d\n",*((char *)p));
return 0;
}