指针
变量与地址
变量给谁用的?
变量是对某一块空间的抽象命名。
变量名就是你抽象出来的某块空间的别名。
指针就是地址。指向某个地址。
指针与指针变量
指针是指向某块地址。指针(地址)是常量。
指针变量是可以发生变化的。
#include <stdio.h>
int main()
{
int i = 1;
int *p = &i;
printf("i = %d \n", i);
printf("&i = %p \n", &i);
printf(" p = %p \n", p);
printf("&p = %p \n", &p);
printf("*p = %d \n", *p);
// 为什么不用char* p = &i;
//TYPE NAME = VALUE
//int* p = &i;
//int i = 1;
}
直接访问间接访问
占内存空间
都是8字节,linux 64 位中。
空指针 野指针 空类型
int * i= NULL;
指针运算
两个指针同时指向一个数组。++ 、–、比较、关系、&、*
指针与一维数组
数组名和 指针的区别?
a是数组名字是一个表示地址的常量。
指针是一个变量。
a++;
p++;
#include <stdio.h>
int main()
{
int a[3] = {1,2,3};
int *p = a;
int i;
for(i = 0;i < sizeof(a)/sizeof(*a); i++) {
printf("%d %d %d %d \n",a[i],*(a+i),p[i],*(p+i)); // a[i]
printf("%p %p %p %p \n",a+i, &a[i],p+i, p+i); // &a[i]
}
printf("\n");
}
这里代码体现什么是指针常量什么是指针变量?
#include <stdio.h>
int main()
{
int a[3];
int i;
int *p = a;
for(i = 0;i < sizeof(a)/sizeof(*a); i++) {
printf("%p -> %d\n",&a[i],a[i]);
}
for(i = 0;i <sizeof(a)/sizeof(*a); i++) {
scanf("%d",p++);
}
//p = a;
for(i = 0;i < sizeof(a)/sizeof(*a); i++,p++) {
printf("%p -> %d\n",p,*p);
}
printf("\n");
}
指针与二维数组
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[2][3] = {
1,2,3,4,5,9};
int i,j;
int *p;
//(W) p = a;
//wall等号右边a是在行间跳转的指针
// 等号左边是列间跳转的指针
p = *(a+0);
//p = &a[0][0];//*(a+0),*a;
printf("%p->%p \n", a, a + 1);
// printf("%p -> %d \n\n",p,*p);
// for(i = 0; i < 6; i++,p++) {
// printf("%d ",*p);
// }
// printf("\n");
for(i = 0;i < 2; i++) {
for(j = 0; j < 3; j++) {
printf("%p->%d\n",&a[i][j],a[i][j]);
printf("%p->%d\n",*(a+i)+j,*(*(a+i)+j));
//printf("%p->%d\n",a[i]+j,*(*(a+i)+j));
//printf("%d ",a[i][j]);
}
printf("\n");
}
exit(0);
}
指针与字符数组
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 字符指针和字符数组之间的使用
//
// 练习 定义数组后定义指针 后面操作都用指针实现
int main()
{
#if 0
char* str = "hello"; // "hello" 串常量
printf("%d %d \n",sizeof(str),strlen(str));// 8 5
//strcpy(str,"world"); //err 为什么不可以?区分字符指针和字符数组的区别 :企图用"world" 覆盖串常量
str = "world";
puts(str);
#endif
#if 0
char str[] = "hello";
printf("%d %d \n",sizeof(str),strlen(str));// 6 5
// (F) str = "hhhh"; // 数组名是一个地址常量怎么可能放到等号左边???
strcpy(str,"jjjj");