C 语言指针

1、指针声明

int *anIntergePointer;
void *aPointerToAnything;

2、指针初始化

int *anIntergePointer = NULL;
void *aPointerToAnything = NULL;

* 初始化指针并没有初始化数据,初始化数据也不会初始化指针

3、指针的间接寻址

当程序要访问一个指针变量指示的内存地址时,我们说它是对指针的间接寻址。

程序用星号运算符(*)来对指针间接寻址,如:

int a = 5;
int *aPtr = &a; ==> int *aPtr = NULL; aPtr = &a;
printf("%d\n", *aPtr); // output is 5 表达为 aPtr所指的内存位置的内容

4、指向结构体或联合

customer c;
customer *cPtr;
cPtr = &c;
*cPtr.zip = 422300; ==> cPtr->zip = 422300;
// 大多数使用箭头

每个数组的名称就是第一个元素的地址。

通过偏移量来计算数组的地址,

int anArr[10] = {0,1,2,3,4,5,6,7,8,9};
int aInt;
int bInt;
int cPtr;
cPtr = anArr;
aInt = *cPtr; // 获取第一个元素值
bInt = *(cPtr + 1); // 获取第二个元素值

5、指针和函数

什么时候传值,什么时候传地址?

1、我们需要通过参数列表从函数外得到一些信息
2、函数需要返回多个值
3、程序需要在函数内部改变数据,并且当函数结束时,这个数据还保持改变后的值
4、数据太大,用传值的效率太低

指针返回值,不能返回临时变量地址

6、void类型指针的复杂性

int a[] = {1,2,3,4,5};
int *aPtr;
void *voidPtr;
aPtr = a;

// work ok
for(int a=0;a<5;a++) {
    printf("%d\n", *aPtr++);
}

// won't work
voidPtr = a;
for(int a=0;a<5;a++) {
    printf("%d\n", *aPtr++);
}

// work ok
voidPtr = a;
for(int a=0;a<5;a++) {
    printf("%d\n", *((int *)aPtr)++);
}


标签: C/C++
相关文章
评论留言
发布留言