1.指针和内存单元
#include <stdio.h>
int main(void)
{
int a = 10;
int* p = &a;
*p = 2000;
printf("a = %d\n", a);
return 0;
}
#include <stdio.h>
int main(void)
{
int a = 10;
int* p = &a;
//*p = 2000;
a = 350;
//printf("a = %d\n", a);
printf("*p = %d\n", *p);
return 0;
}
2.指针定义和使用
3.野指针和空指针
#include <stdio.h>
int main(void)
{
int* p;
*p = 2000;
printf("*p = %d\n", *p);
return 0;
}
int main(void)
{
int* p = 10;
*p = 2000;
printf("*p = %d\n", *p);
return 0;
}
4.万能指针/泛型指针
#include <stdio.h>
int main(void)
{
int a = 345;
void* p;
p = &a;
printf("*p = %d\n", *(int*)p);
return 0;
}
int main(void)
{
int ch = 'R';
void* p;
p = &ch;
printf("*p = %c\n", *(char*)p);
return 0;
}
5.const关键字
#include <stdio.h>
int main(void)
{
const int a = 20;
int* p = &a;
*p = 650;
printf("a = %d\n", a);
return 0;
}
6.指针和数组
#include <stdio.h>
int main(void)
{
int a[] = { 1,2,3,4,5,6,7,8,9,0 };
int n = sizeof(a) / sizeof(a[0]);
int* p = a;
for (size_t i = 0; i < n; i++)
{
//printf("%d ", a[i]);
//printf("%d ", *(a + i));
//printf("%d ", p[i]);
printf("%d ", *(p+i));
}
return 0;
}
int main(void)
{
int a[] = { 1,2,3,4,5,6,7,8,9,0 };
int n = sizeof(a) / sizeof(a[0]);
int* p = a;
printf("first p = %p\n", p);
for (size_t i = 0; i < n; i++)
{
printf("%d ", *p);
p++;
}
putchar('\n');
printf("last p = %p\n", p);
return 0;
}
int main(void)
{
int arr[10];
int n = sizeof(arr) / sizeof(arr[0]);
int* p = arr;
for (size_t i = 0; i < n; i++)
{
*(p + i) = 10 + i;
}
for (size_t i = 0; i < n; i++)
{
printf("%d ", *p);
p++;
}
putchar('\n');
return 0;
}
7.指针加减运算
#include <stdio.h>
int main(void)
{
int a[] = { 0,1,2,3,4,5,6,7,8,9 };
int* p = &a[5];
printf("p - 2 = %p\n", p - 2);
printf("&a[3] = %p\n", &a[3]);
return 0;
}
//&数组名+1
int main(void)
{
int a[] = { 0,1,2,3,4,5,6,7,8,9 };
printf("a = %p\n", a);//a = 004FF794
printf("&a[0] = %p\n", &a[0]);//&a[0] = 004FF794
printf("a+1 = %p\n", a + 1);//a+1 = 004FF798
printf("&a = %p\n", &a);//&a = 004FF794
printf("&a+1 = %p\n", &a+1);//&a + 1 = 004FF7BC 16进制28==10进制40
return 0;
}
//指针加减指针
int main(void)
{
int a[] = { 0,1,2,3,4,5,6,7,8,9 };
int* p = &a[8];
int* q = &a[3];
printf("p - q = %d\n", p - q);//p - q = 5
return 0;
}
int main(void)
{
int a[] = { 0,1,2,3,4,5,6,7,8,9 };
int* p = a;
for (size_t i = 0; i < 10; i++)
{
printf("%d ", *p);
p++;
}
putchar('\n');
printf("p - a = %d\n", p - a);//p - a = 10
return 0;
}
8.指针实现 strlen 函数
#include <stdio.h>
int mystrlen(char str[]);
int main(void)
{
char str[] = "hello";
int ret = mystrlen(str);
printf("ret = %d\n", ret);
return 0;
}
int mystrlen(char str[])
{
int i = 0;
while (str[i] != '\0')
{
i++;
}
return i;
}
//借助指针++实现
int mystrlen2(char str[])
{
char* p = str;
while (*p != '\0')
{
p++;
}
return p-str;//返回数组元素的个数
}
9.指针比较运算
#include <stdio.h>
int main(void)
{
int a[] = { 0,1,2,3,4,5,6,7,8,9 };
int* p = &a[3];
if (p > a)
printf("成立\n");
else if(p < a)
printf("不成立\n");
else
printf("==\n");
return 0;
}
10.指针数组
#include <stdio.h>
int main(void)
{
int a = 10;
int b = 20;
int c = 30;
int* p1 = &a;
int* p2 = &b;
int* p3 = &c;
int *arr[] = { p1,p2,p3 };//整型指针数组arr,存的都是整型地址
printf("*(arr[0]) = %d\n", *(*(arr + 0)));//arr[0]=*(arr+0)
printf("*(arr[0]) = %d\n", **arr);//*(arr[0]) = 10
return 0;
}
int main(void)
{
int a[] = { 10 };
int b[] = { 20 };
int c[] = { 30 };
int *arr[] = { a,b,c };
//arr[0][0]==*(arr[0]+0)=*(*(arr+0)+0)
printf("arr[0][0] = %d\n", **arr);//arr[0][0] = 10
printf("arr[0][0] = %d\n", *(*(arr + 0) + 0));//arr[0][0] = 10
return 0;
}
11.多级指针
#include <stdio.h>
int main(void)
{
int a = 10;
int* p = &a;
int** pp = &p;
//int** pp = &(&a);不允许
int*** ppp = &pp;
printf("***ppp = %d\n", ***ppp);//***ppp = 10
printf("**pp = %d\n", **pp);//**pp = 10
printf("*p = %d\n", *p);//*p = 10
printf("a = %d\n", a);//a = 10
return 0;
}