指针也就是内存地址,指针变量是用来存放内存地址的变量。 就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。
#include
int main ()
{int var = 20;int *ip; // 声明一个变量,存放的是整数指针int* (即地址)ip = &var; // 取址printf("var 变量的地址: %p\n", &var );printf("ip 变量存储的地址: %p\n", ip );printf("*ip 变量的值: %d\n", *ip );return 0;
}
var 变量的地址: 0x7ffeeef168d8
ip 变量存储的地址: 0x7ffeeef168d8
*ip 变量的值: 20
#include
int main ()
{int *ptr = NULL;printf("ptr 的地址是 %p\n", ptr);return 0;
}
ptr 的地址是 0x0
在大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是操作系统保留的。然而,内存地址 0 有特别重要的意义,它表明该指针不指向一个可访问的内存位置。 但按照惯例,如果指针包含空值(零值),则假定它不指向任何东西。
#include
const int MAX = 3;
int main()
{int var[] = {10, 100, 200};int i, *ptr;ptr = var;for (i = 0; i < MAX; i++){printf("存储地址:var[%d] = %p\n", i, ptr);printf("存储值:var[%d] = %d\n", i, *ptr);ptr++;}return 0;
}
存储地址:var[0] = e4a298cc
存储值:var[0] = 10
存储地址:var[1] = e4a298d0 //一个int占4个字节,要是一个字符就占一个字节
存储值:var[1] = 100
存储地址:var[2] = e4a298d4
存储值:var[2] = 200
#include
const int MAX = 3;
int main ()
{int var[] = {10, 100, 200};int i, *ptr;ptr = var; // 指针中第一个元素的地址i = 0;while (ptr <= &var[MAX - 1]){printf("存储地址:var[%d] = %p\n", i, ptr );printf("存储值:var[%d] = %d\n", i, *ptr );ptr++;i++;}return 0;
}
int *ptr[MAX];
在这里,把ptr声明为一个数组,由MAX个整数指针组成。因此,ptr 中的每个元素,都是一个指向 int 值的指针(地址)。
#include
const int MAX = 3;
int main ()
{int var[] = {10, 100, 200};int i, *ptr[MAX];for ( i = 0; i < MAX; i++){ptr[i] = &var[i]; /* 赋值为整数的地址 */}for ( i = 0; i < MAX; i++){printf("Value of var[%d] = %d\n", i, *ptr[i] );}return 0;
}
Value of var[0] = 10
Value of var[1] = 100
Value of var[2] = 200
#include
#include
// 函数声明
void getSeconds(unsigned long *par);int main ()
{unsigned long sec;getSeconds( &sec ); // 对sec赋值 -> 传地址;不是复制printf("Number of seconds: %ld\n", sec);return 0;
}
void getSeconds(unsigned long *par)
{*par = time( NULL ); // 获取当前的秒数, 地址--值, 赋值return;
}
Number of seconds :1294450468
————
将数组转换为指针:arr[5], 其中5加在指针上,右移指针;[]为取值,作用等同 *p 取值。
#include // 函数声明
double getAverage(int *arr, int size);int main ()
{int balance[5] = {1000, 2, 3, 17, 50};double avg;avg = getAverage(balance, 5); // 传递一个"指向数组的指针"作为参数printf("Average value is: %f\n", avg );return 0;
}double getAverage(int *arr, int size)
{int i, sum = 0; double avg; for (i = 0; i < size; ++i) {sum += arr[i];}avg = (double)sum / size;return avg;
}
Average value is: 214.40000
C 语言不支持在调用函数时返回局部变量的地址,除非定义局部变量为 static 变量。
#include
#include
#include int * getRandom( )
{static int r[10]; // 函数返回局部变量的地址,要加static,为什么加了就可以?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;
}
1523198053
1187214107
1108300978
430494959
1421301276
930971084
123250484
106932140
1604461820
149169022
*(p + [0]) : 1523198053
*(p + [1]) : 1187214107
*(p + [2]) : 1108300978
*(p + [3]) : 430494959
*(p + [4]) : 1421301276
*(p + [5]) : 930971084
*(p + [6]) : 123250484
*(p + [7]) : 106932140
*(p + [8]) : 1604461820
*(p + [9]) : 149169022