目录
1. 星号的三种含义
1. 乘法
2. 定义指针变量
int * p; //定义了一个名字叫p的变量,int *表示p只能存放int变量的地址
3. 指针运算符
该运算符放在已经定义好的指针变量前
如果p是一个已定义好的指针变量
则*p表示以p的内容为地址的变量
2. 如何通过被调函数修改主调函数普通变量的值
1. 实参必须为该普通变量的地址
2. 形参必须为指针变量
3. 在被调函数中通过
*形参名 = ....
的方式就可以修改主函数相关变量的值
#include<stdio.h>
void g(int* p, int* q)
{
*p = 1;
*q = 3;
}
int main(void)
{
int a = 3, b = 5;
g(&a, &b);
printf("%d %d\n", a, b);
return 0;
}
3. 指针和数组
3.1 一维数组和指针
一维数组名
一维数组名是个指针常量
他存放的是一堆维组第一个元素的地址
#include<stdio.h>
int main(void)
{
int a[5]; //a是数组名 5是数组元素的个数 元素就是变量 a[0] -- a[4]
//int a[3][4]; //三行四列 a[0][0]是第一个元素 a[i][j]第i+1行 第j+1列
int b[5];
//a = b;//error a是常量
printf("%#X\n", &a[0]);
printf("%#X\n", a);
return 0;
}/* 0X7E99FA98
0X7E99FA98 输出结果一样 */
下标和指针的关系
如果p是个指针变量,则
p[i] 永远等价于 *(p + i)
确定一个一维数组需要几个参数
#include<stdio.h>
//f函数可以输出任何一个一维数组的内容
void f(int* pArr, int len)
{
int i;
for (i = 0; i < len; ++i)
printf("%d ", *(pArr + i) ); //*pArr *(pArr+1) *(pArr+2)
printf("\n");
}
int main(void)
{
int a[5] = { 1,2,3,4,5 };
int b[5] = { -1,-2,-3,-4,-5 };
int c[100] = { 10, 23,4,49 };
f(a, 5); // a是 int *
f(b, 5);
f(c, 100);
return 0;
}
需要两个参数:
数组第一个元素的地址
数组的长度
include<stdio.h>
void f(int* pArr, int len)
{
pArr[3] = 88;
}
int main(void)
{
int a[6] = { 1,2,3,4,5,6 };
printf("%d\n", a[3]);
f(a, 6);
printf("%d\n", a[3]);
return 0;
}/*
4
88 */
#include<stdio.h>
void f(int* pArr, int len)
{
int i;
for (i = 0; i < len; ++i)
printf("%d ", pArr[i]);//*(pArr+i)等价于pArr[i]
printf("\n");
}
int main(void)
{
int a[5] = { 1,2,3,4,5 };
int b[5] = { 1,3,5,6,7 };
int c[100] = { 1,33,56,78,19 };
f(a, 5);
f(b, 5);
f(c, 100);
return 0;
}/*
1 2 3 4 5
1 3 5 6 7
1 33 56 78 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*/
指针变量的运算
指针变量不能相加 不能相乘 也不能相除
如果两个指针变量指向的是同一块连续空间的不同存储单元
则这两个指针变量才可以相减
#include<stdio.h>
int main(void)
{
int i = 5;
int j = 10;
int * p = &i;
int* q = &j;
int a[5];
p = &a[1];
q = &a[4];
printf("p和q所指向的单元相隔%d个单元\n", q - p);
//p - q没用实际意义
return 0;
}
3.2 一个指针变量到底占几个字节
注 :sizeof(数据变量)
功能:返回值就是该数据类型所占的字节数、
sizeof(int) = 4 sizeof(char) = 1 sizeof(double) = 8
sizeof(变量名)
功能:返回值是该变量所占的字节数
假设p指向char类型变量(一个字节)
假设q指向int类型变量(4个字节)
假设r指向double类型变量(8个字节)
#include<stdio.h>
int main(void)
{
char ch = 'A';
int i = 99;
double x = 66.6;
char* p = &ch;
int* q = &i;
double* r = &x;
printf("%d %d %d\n", sizeof(p), sizeof(q), sizeof(r));
return 0;
}/* 8 8 8
*/
p q r本身所占的字节数是一样的
总结 一个指针变量,无论它指向的变量占几个字节 ,该指针变量本身只占四个字节
一个变量的地址使用该变量首字节的地址来表示