一、指针
指针是一种用来存放地址的数据类型。
定义形式: (基类型)*指针变量名
定义一个指针时,*符号是类型说明符,例如,int *p;
声明了一个指向整数类型的指针p。
取地址运算符 &
:获取变量的内存地址。例如,int a = 5; int *p = &a;
将变量a
的地址赋值给指针p
。
指针运算符 *
:通过指针访问指针指向的变量。例如,int value = *p;
将指针p
指向的地址中的值赋给变量value
。
二、指针的引用
指针传递:在函数调用时,指针作为参数传递的是变量的地址,而不是变量的副本。这意味着在函数内部对指针所指向的变量进行的修改会影响到原始变量,即通过指针运算可以实现在被调函数中修改主调函数中的内容。
指针的执行步骤:
1.通过指针变量中的值到内存空间中定位。
2.从定位处开始向后偏移sizeof(基类型)个字节。
3.将偏移好的那部分内存空间看作是一个基类型
当定义一个指针后,既不初始化也不赋值时,指针中的地址为随机值,这种指针称为野指针,野指针很危险,使用野指针会导致程序崩溃。
空指针:空指针是指不指向任何有效内存地址的指针,通常用NULL
表示。
二、指针的运用
1.指针与数组
数组名本质上是一个指向数组首元素的指针。例如,int arr[10]; int *p = arr;
,此时p
指向数组arr
的首元素。
- 指针算术:指针可以进行加减运算,以遍历数组。例如,
p++
使指针p
指向下一个元素。
2.指针函数
函数的返回值类型定义为指针类型时,这个函数就是指针函数
#include <stdio.h>
void maxMinOfThreeNumbers(int a,int b,int c,int *max,int *min)
{
*max = a > b ? a : b;
*max = *max > c? *max : c;
*min = a > b ? b : a;
*min = *min > c? c : *min;
}
void maxofnumber(int a,int b,int *max)
{
*max = a > b ? a: b ;
}
void port(int i)
{
char *p = (char *) &i;
if(*p == 1)
{
puts("smallport");
}
else
{
puts("bigport");
}
}
void maxOfArray(int *a,int len ,int *max)
{
*max = *a;
for(int i = 1 ; i < len ;++i)
{
*max = *max > *(a + i) ?*max : *(a + i);
}
}
void swap(int *a,int*b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
void reverse(int *a,int len)
{
for(int i = 0 ; i < len / 2; ++i)
{
swap(a + i , a + len - i - 1);
}
}
void printArray(int *a, int len )
{
for(int i = 0 ; i < len ;++i)
{
printf("%d ",*(a + i));
}
puts("");
}
void selectionsort(int *a,int len)
{
for(int i = 0 ; i < len - 1 ; ++i)
{
for(int j = i + 1; j < len ; ++j)
{
if(*(a + i) > *(a + j))
{
swap(a + i , a + j);
}
}
}
}
void bubbleSort(int *a,int len)
{
for(int i = len - 1 ; i > 0; -- i)
{
for(int j = 0; j < i ; ++j)
{
if(*(a + j ) > *(a + j + 1))
{
swap(a + j , a + j + 1);
}
}
}
}
void insertionsort(int *a,int len)
{
for(int i = 0 ; i < len ; ++i)
{
int t = *(a + i);
int j = i;
while( j > 0 && *(a + j - 1) > 0)
{
*(a + i) = *(a + j - 1);
--j;
}
*(a + j) = t;
}
}
int *binarySearch(int *a,int len,int n)
{
int begin = 0 , end = len,i,mid;
while(begin <= end)
{
mid = (begin + end) / 2 ;
if( n > *(a + mid))
{
begin = mid + 1;
}
else if(n < *(a + mid))
{
end = end - 1;
}
else
{
return a + mid;
}
}
return NULL;
}
void main(void)
{
int a[] = {1,2,3,4,5,6,7,8,9,0};
int len = sizeof(a) / sizeof (a[0]);
//reverse(a,len);
//bubbleSort(a,len);
//selectionsort(a,len);
insertionsort(a,len);
int *ret = binarySearch(a,len,5);
if (ret == NULL)
{
puts("Not found");
}
else
{
puts("found");
printf("address = %p\n",ret);
}
printArray(a,len);
// int a = 10 , b = 15,c = 25,i = 1;
// int max,min;
// maxofnumber(a,b,&max);
// maxMinOfThreeNumbers(a,b,c,&max,&min);
// printf("%d,%d\n",max,min);
//int *p = a,sum = 0;
//int max;
//maxOfArray(a,len,&max);
//printf("%d\n",max);
}