指针
指针定义:
在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
即说白了指针就是存放地址的,而我们可以通过指针来寻找指针所指的指针内容
指针的大小在32位平台是4个字节,在64位平台是8个字节。
指针和指针类型:
指针的定义方式为
type + *
而指针类型有:
char
int
short
long
float
double
指针类型的意义是:
指针的类型决定了指针向前或者向后走一步有多大(距离)
也就是决定了对指针解引用的时候有多大的权限(能操作几个字节)
比如: char* 的指针解引用就只能访问一个字节,而 int*的指针的解引用就能访问四个字节。
野指针
野指针概念:
野指针就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)
野指针成因:
1. 指针未初始化
2. 指针越界访问
3. 指针指向的空间释放
指针运算
1.指针加减整数
#define N_VALUES 5
float values[N_VALUES];
float *vp;
//指针+-整数;指针的关系运算
for (vp = &values[0]; vp < &values[N_VALUES];)
{
*vp++ = 0; //该代码相当于:*vp = 0;
// vp++
}
2.指针减指针
nt my_strlen(char *s) //指针-指针只有再同一块内存才有意义
{
char *p = s;
while(*p != '\0' )
p++;
return p-s;
}
3.指针的关系运算
for(vp = &values[N_VALUES]; vp > &values[0];)
{
*--vp = 0; //该代码相当于:--vp; *vp=0;
}
指针和数组:
例子:
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
printf("%p\n", arr);
printf("%p\n", &arr[0]);
return 0;
}
在这个例子中arr代表的是数组arr的地址
用指针来访问数组:
例子如下
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,0};
int *p = arr; //指针存放数组首元素的地址
int sz = sizeof(arr)/sizeof(arr[0]);
for(i=0; i<sz; i++)
{
printf("&arr[%d] = %p p+%d = %p\n", i, &arr[i], i, p+i); //前后对比
}
return 0;
}
C语言指针常见简单编程题
1.使用指针打印数组内容
写一个函数打印arr数组的内容,不使用数组下标,使用指针
arr是一个整形一维数组
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = a;
int sz = sizeof(a) / sizeof(a[0]); //sz=数组的长度
for (int i = 0; i < sz; i++)
{
printf("%d ", *p); //对a解引用
p++; //获取p的下一个地址
}
}
2.字符串逆序
写一个函数,可以逆序一个字符串的内容
char *back(char * arr,int len)
{
char* right = arr + strlen(arr) - 1;
char* left = arr;
while (right > left) //交换内容
{
char temp = *left;
*left = *right;
*right = temp;
right--;
left++;
}
return arr;
}
int main()
{
char a[] = "my little world";
int len = sizeof(a) / sizeof(a[0]);
char *test = back(a, len);
printf("%s ", test);
}
3.计算求和
求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字
例如2+22+222+2222+22222
int main()
{
int a = 0;
int n = 0;
int temp = 0;
scanf_s("%d,%d", &a , &n); //首先输入一个前n项以及计算的数字
int sum = 0;
for (int i = 0; i < n; i++)
{
temp = temp * 10 + a;
sum = sum + temp;
}
printf("%d", sum);
}
4.打印水仙花数
求出0~100000之间所有“水仙花数”并输出
水仙花数的定义为:“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。
int main()
{
for (int i = 0; i < 100000; i++)
{
int sum = 0;
int temp = i;
int count = 1;
while (temp/10) //有多少位数
{
temp = temp / 10; //每次循环除10,则次方加一
count++;
}
temp = i;
while (temp) //每一位数的次方和
{
sum = sum + pow(temp % 10, count); //每次循环都加上该位数的和
temp = temp / 10; //每次循环temp除10
}
if (sum == i) //判断是否相等
{
printf("%d ", i);
}
}
}