C-指针
指针
每一个变量都有一个内存位置, 每一个内存位置都定义了可使用 & 运算符访问的地址, 它表示了在内存中的一个地址.
指针也就是内存地址, 指针变量是用来存放内存地址的变量.
int a = 1;
int * p = NULL;
p = &a;
printf("变量a的地址为: %p", p);
printf("内存上存储的值为: %d", *p);
// *号: 间接运算符, 也叫解引用运算符, 用来获取对应地址存储的值
*p = 10;
printf("变量a的值为: %d", a); // a = 10
传递指针给函数
通过引用或地址传递参数, 使传递的参数在调用函数中被改变.
#include <stdio.h>
void swap_value(int* v1, int* v2)
{
int temp;
temp = *v1;
*v1 = *v2;
*v2 = temp;
}
int main()
{
int a = 1, b = 10;
swap_value(&a, &b);
printf("a = %d, b = %d", a, b);
return 0;
}
从函数返回指针
允许函数返回指针到局部变量、静态变量和动态内存分配.
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int* getRandom()
{
static int r[10];
int i;
/* 设置种子 */
srand( (unsigned)time( NULL ) );
for (i = 0; i < 10; ++i)
{
r[i] = rand();
printf("%d\n", r[i]);
}
return r;
}
int main ()
{
int *p;
int i;
p = getRandom();
for (i = 0; i < 10; i++)
{
printf("*(p + [%d]) : %d\n", i, *(p + i) );
}
return 0;
}
const类型
-
const
在定义指针前面, 不能通过指针改变指向变量的值int a = 1, b = 10; const int* p = &a; *p = 20; // !!!报错!!! a = 20; // 可以这样改变值 p = &b; // 可以改变指针的指向
-
const
在定义指针后面, 不能改变指针的指向int a = 1, b = 10; int* const p = &a; *p = 20; // 可以改变值 p = &b; // !!!报错!!!
-
const
在定义指针的前面和后面, 兼顾以上两种int a = 1, b = 10; const int* const p = &a; *p = 20; // !!!报错!!! p = &b; // !!!报错!!!