指针是·学懂c语言最关键的部分之一。首先我们先来了解一下指针到底是什么吧?
指针大小在32位平台下是4个byte,其值为某一个内存的地址。每个地址表示一个字节
什么是指针
这里我们用一段代码来说明:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <windows.h>
int main()
{
int a = 10;//定义会分配空间,声明不分配空间
int *p = &a;//开辟4个字节,取出a的地址放到p变量中,即p指向a的地址
printf("%p\n", p);
system("pause");
return 0;
}
指针的类型:type + * ;
注意:类型决定了开辟空间的大小以及如何解析该变量的内容(从栈角度)。
总的来说:指针就是地址。
指针变量:用来存放地址的变量;
变量指针:即变量的地址;
指针加减整数
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <windows.h>
int main()
{
int n = 10;
char *p = (char*)&n;
int *q = &n;
printf("%p\n", &n);
printf("%p\n", p);
printf("%p\n", q);//前三个结果相同
printf("%p\n", p + 1);//指针加1加的是其所指向元素类型的大小
printf("%p\n", q+1);
system("pause");
return 0;
}
char* 的指针解引用只能访问一个字节,而int * 的指针解引用访问4个字节。
指针表达式解析
变量做左值必须有存储空间,做右值必须有内容
接下来借助一些代码了解,千万不要被绕晕喽,接招吧!
char ch = 'a';
char *cp = &ch;
判断如下哪个可做左值,哪个可做右值?
&ch; //地址常量,可右不可左 ,ch可以做左值
cp;//变量,可左可右
&cp; //地址常量,可右不可左
*cp + 1;//常量,可右不可左
*(cp + 1); //表示cp之后的一段空间,可左可右
++cp; //C语言变量前置++不能做左值,可做右值
cp++;//C语言变量后置++不能做左值,可做右值
*++cp; //先++再* ch的下一个空间,可左可右
*cp++; //可左可右,先解引用,再++
++*cp; // 可右不可左
(*cp)++; //可右不可左
++*++cp; //ch的下一块空间,可右不可左
++*cp++; //可右不可左
接下来写个实例来说明指针吧!
分别用数组和指针两种方式对 10个整数由大到小排序
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <windows.h>
#include <assert.h>
//分别用数组和指针进行排序
void swap(int *x, int *y)
{
*x ^= *y;
*y ^= *x;
*x ^= *y;
}
void Bubble_sort(int *a, int sz)//指针
{
assert(a);
assert(sz > 0);
int *end = a + sz - 1;//指向最后一个元素
int *start =a;//指向第一个元素
while (end > a)
{
int flag = 0;
for (start = a; start < end; start++)
{
if (*start > *(start+1))
{
flag = 1;
swap(start, start + 1);
}
}
if (flag == 0)//没有交换
{
break;
}
end--;
}
}
//void Bubble_sort(int *a, int sz)//数组
//{
// assert(a);
// assert(sz > 0);
// int i = 0;
// for (; i < sz - 1; i++)
// {
// int j = 0;
// int flag = 0;//避免已经有序的数组进行冒泡
// for (; j < sz - 1 - i; j++)
// {
// if (a[j]>a[j + 1])
// {
// flag = 1;
// swap(&a[j], &a[j + 1]);
// }
// }
// if (flag == 0)
// return;
// }
//}
void print(int a[], int sz)
{
int i = 0;
for (; i < sz; i++)
{
printf("%d ", a[i]);
}
printf("\n");
}
int main()
{
int a[] = { 3,1,2,43,2,1,45,12,13,6};
int sz = sizeof(a) / sizeof(a[0]);
print(a, sz);
Bubble_sort(a, sz);
print(a, sz);
system("pause");
return 0;
}
由此可见指针比数组代码更加简洁!