//数组当参数时传递的不是整个数组
//传递就是数组元素的首地址(就是传递了指针)
//printf("%lu"),sizeof(array);
//传递就是数组元素的首地址(就是传递了指针)
//printf("%lu"),sizeof(array);
字节是内存当中最小的存储单位
一个字节是8个二进制位
访问变量:
1.直接访问:通过变量名直接访问
2.间接访问:通过变量的地址(内存编号)间接访问变量
指针变量
int *p = NULL;
声明指针的时候 *没有特殊意义只是告诉编译器这是一个指针变量
int :
表示这个指针变量所指向的内存区域是一个整形存储区域也就是说指针变量p指向的内存区域里面存储的值是一个整形
int a = 5;
声明一个指针变量
int *p = NULL;
指针变量 p指向
a的存储区域(地址)
&取地址符
&a 取出变量a的地址
p = &a;
打印地址的占位符
%p
printf("%p\n",p);
printf("%p\n",&a);
*
取值符
*p表示指针变量p所指向的地址里面所保存的值
printf("%d\n",a);
通过指针变量p来打印
printf("%d\n",*p);
修改变量a的值
a = 3; //直接访问
*p = 30; //间接访问
printf("%d\n",*p);
打印指针变量占用字节数
指针变量占用8个字节不管什么数据类型只跟操作系统有关
printf("%lu\n",sizeof(p));//sizeof函数是计算指针所占的字节数
int a = 5;
int *p = &a;
int b = 3;
p = &b;//指针变量的赋值相当于指针的重指向
printf("%d\n",*p);
习题一
int num1 = 50;
int num2 = 40;
int *p = &num1;
int *q = &num2;
q = p;
*q = 100;
printf("num1 : %d\n",num1);//100
printf("num2 : %d\n",num2);//40
printf("p:%p\n",p);
printf("q:%p\n",q);//p1 p2地址一样
printf("*p:%d\n",*p);//100
printf("*q:%d\n",*q);//100
指针的运算
地址里面的值可以加减乘除
地址的运算只有加和减
地址加1要看指针变量的数据类型:
如果 int类型地址加1相当于加4个字节
如果 char类型地址加1相当于加1个字节
int a = 3;
int *p = &a;
printf("%p\n",p);
p++;
printf("%p\n",p);
int a = 3;
int b = 5;
int *p = &a;
//系统在分配变量的内存时不一定分配的是连续的
//如果是数组 分配的一定是连续的存储区域
printf("%p\n",&a);
printf("%p\n",&b);
printf("%d\n",*p);
p--;//因为指针p指向int类型的a;指针减1就相当于地址减4
printf("%d\n",*p);
//需求:编写一个函数通过指针交换两个变量的值
int a = 3;
int b = 5;
printf("%p\n",&a);
printf("%p\n",&b);
//指针在参数的传递是实参向形参进行的传递是一个拷贝的过程 是一个值的传递地址不一样
//交换本着一个原则操作的变量的地址应该是一致的
Change(&a, &b);
//函数名为Change的函数
void Change(int *a,int *b){
int
temp = *a;
*a = *b;
*a = *b;
*b = temp;
}
printf("a = %d\n",a);
printf("b = %d\n",b);
printf("%p\n",&a);
printf("%p\n",&b);
//指针与数组
int array[4] = {1, 3, 5, 7};
printf("%p\n",&array[0]);
printf("%p\n",array);
//声明一个指针变量指向数组(数组的首元素)
//数组的名字本身就是数组首元素的地址不需要加取地址符
int *p = array;
printf("*p = %d\n",*p);//1
printf("*(p + 1) = %d\n",*(p + 1));//3
printf("%d \n",array[2]);//5
printf("*(p + 2) = %d\n",*(p + 2));//5
printf("%d\n",p[2]);//5
printf("%d\n",*(array + 2));//5
//取出数组中的元素方法
array[下标]
//*(array +下标)
//利用指针变量p取出数组元素
//利用指针变量p取出数组元素
//p[下标]
*(p +
下标)
计算数组当中元素的个数
数组中总的元素的字节数
/数组中单个元素的字节数=数组元素个数
int count = sizeof(array) / sizeof(array[0]);
通过指针变量p不能求出来数组元素个数
指针变量占8字节只跟操作系统有关
int count = sizeof(p);
printf("%d",count);
//指针与字符串
char str1[] = "iphone";
//声明一个指针指向str1
char *p = str1;
//1.利用指针打印字符串
printf("%s\n",str1);
printf("%s\n",p);
//2.利用指针打印字符
h
printf("%c\n",str1[2]);
printf("%c\n",*(p + 2));
printf("%c\n",p[2]);
printf("%c\n",*(str1 + 2));
//把h更改成
w
str1[2] = ‘w';
printf("%s\n",str1);
//通过指针来计算字符串的长度
char str[] = "wanglong";
//声明一个指针指向字符串str
char *p = str;
int count = 0;//保存长度
// 思路:第一位
*(p + 0);
//思路:第二位
*(p + 1);
//思路:第三位
*(p + 2);
//思路:第四位
*(p + 3);
// *(p + i)==
'\0'字符串结束了
while (*p != '\0') {
p++;
count++;
}
printf("%d\n",count);
//"iphone"常量字符串
char stu1[] = "ios";
char stu2[] = "Android";
char stu3[] = "Win";
char *strings[3] = {"iOS", "Android", "Win8"};
//指针数组数组中保存的都是同一个类型的数据指针数组中保存的都是指针类型保存的都是地址
printf("%s\n",strings[0]);
printf("%s\n",*strings);
printf("%s\n",*(strings + 1));
printf("%c\n",*strings[0]);
*strings[0] = 'x';
printf("%c\n",*strings[0]);
strings[0] = "sos";
printf("%s\n",*strings);
//如果你声明时声明的是常量字符串那么你是不能更改的 如果你声明时先声明一个字符串(这时这个字符串是从常量区拷贝拷贝栈区)这时候你可以对字符串进行修改