C语言之指针篇

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值