今天主要学习的是指针 下面是今天记得各种知识点
指针变量
int *p = NULL;
&对变量取地址
*是对指针变量 (针对地址操作) 取地址内容
float * ff = &f;
float *dd = ff;
*ff = 10;
printf("%p ",&(*ff));
注意 定义时*是类型定义的一部分整体式int* 型
而到运算时 *是取地址内的值的运算符
"*"和"&"是互逆操作
指针必须有明确的(自己定义的)指向 (赋初值,或者定义后就使用);
指针的指向要有足够空间
char a[3] = {1,4,6};
char *p = a;
//*a == *p ==a[0] == p[0]
//*a[n] = *(a+n) = *p[n] = *(p+n)
printf("%d\n",p[2]);
for (int i = 0 ; i < 3; i ++) {
printf("%d\n",++(*p));
}
指针和数组区别
1 所占空间不同
指针所占的空间只和操作系统位数有关
数组所占空间与元素个数有关.
2 数组名是常量地址 指针是变量地址
int a = 5
char *p = &a;
*p = 5
*p+1 = 0
*p+2 = 0
*p+3 = 0
因为int是4位 char 1位
指针的移动和取值和指针的类型有关
面试题
如何判断一个机器内核
void nh()
{
int a = 1;
if(*(char *)&a == 1){
printf("intel");
}else{
printf("AMD");
}
}
void *a
void 泛型指针 不能操作指针内的数据
]char *string = "iphone";
字符串是常量~~~
任何字符串是常量~~~~
数组存储的是字符串常量的地址~~~~
不要抱着java的思想去做c
总结一下对于指针的今天所得,指针我的理解就像唱片机上的针 它能调用各个地址(唱片上得地方)的数据,播放这些数据,计算机中任何数据都是要存取的
所以指针也是有存储的地方和大小的 指针的大小只和计算机的操作系统有关,和其他无关.指针的使用,肯定不是一言半语能说完的,要多加练习
void sysin(int *a,int number)
{
printf("输入%d个数\n",number);
for (int i = 0 ; i < number; i++) {
scanf("%d",a+i);
}
}
void change(int *a,int number)
{
int max = *a,min = *a,temp= 0,k = 0,j=0;
for (int i = 0 ; i < number; i++) {
if (max < *(a+i)) {
max = *(a+i);
k = i;
}
}
temp =*(a+k);
*(a+k) = *(a+number-1);
*(a+number-1) = temp;
for (int i = 0 ; i < number; i++) {
if (min > *(a+i)) {
min = *(a+i);
j = i;
}
}
temp =*(a+j);
*(a+j) = *a;
*a = temp;
}
void syso(int *a,int number)
{
for (int i = 0 ; i < number; i++) {
printf("%d ",*(a+i));
}
}
void homework1()
{
/*
1、输入10个整数,将其中最小的数与第一个数对换,
把最大的数和最后一个数对换,写3个函数:(1)输入10个数;
(2)进行处理;(3)输出10个数。
*/
int a[4] = {0};
int *p = a;
sysin(p,4);
change(p,4);
syso(p,4);
}
void sort(char *a[],int number)
{
char *temp = NULL;
for (int i = 0 ; i < number-1; i++) {
for (int j = 0 ; j < number - i - 1; j++) {
if( strcmp(a[j], a[j+1]) < 0){
temp = a[j];
a[j] = a[j+1];
a[j+1]= temp;
}
}
}
}
void homework2()
{
/*
2、在主函数中输入10个等长的字符串。用另一个函数对它们排序,
然后在主函数输出10个已经排好的字符串。
*/
char string[10][10]= {0};
char *str[10] = {0};
for (int i = 0 ; i < 10; i++) {
str[i] = string[i];
}
printf("输入相同长度的字符串");
for (int i = 0; i < 10; i++) {
scanf("%s",string[i]);
}
sort(str,10);
for (int i = 0 ; i < 10; i ++) {
printf("%s\n",str[i]);
}
}
void cut(char *a)
{
char *p = a ,*point = a;
while (true) {
if(*p < '0' || *p > '9'){
*point = *p;
point++;
if (*p == '\0' ) {
break;
}
}
p++;
}
printf("%s",a);
}
void homework3()
{
/*
有一字符串,包含数字与字母,编程去除数字。
1、要求在原字符串中操作
2、使用指针处理。
*/
char a[] ="s3de2cf303cdsf";
cut(a);
}
void fun(int x , int *pp,int *n)
{
int k = 0 ;
int *qq = pp;
for (int i = 2 ; i <= x; i = i+2) {
if(x % i == 0 ){
*qq = i;
(*n)++;
k++;
qq++ ;
}
}
for (int i =0 ; i < *n; i++) {
printf("%d ",*(pp+i));
}
}
int main(int argc, const char * argv[])
{
// homework3();
int pp[100] ={0};
int a = 0 ;
int *n = &a;
fun(128 , pp,n);
return 0;
}
另外今天也看了点C++的知识
C++赋初值
int main(int argc, const char * argv[])
{
int sum = 0 ;
for (int i = 0 ; i < 10 ; i++) {
sum++;
}
std::string str;
char a;
short b;
int c ;
long d ;
float e;
double f ;
std::cout << "a = " << a <<"\n";
std::cout << "b = " << b <<"\n";
std::cout << "c = " << c <<"\n";
std::cout << "d = " << d <<"\n";
std::cout << "e = " << e <<"\n";
std::cout << "f = " << f <<"\n";
std::cout << "str = " << str <<"\n";
return 0;
}
第一次
a =
b = 32767
c = 1606416624
d = 1
e = 4.59163e-41
f = 6.95322e-310
str =
以后
a =
b = 0
c = 0
d = 0
e = 0
f = 0
str =
这证明C++中对于变量的初值还是不确定的
所以 定义一个变量马上赋初值是必要的.
栈的理解
相当于向上压的一个机器 只有一个出口,所以地址越高 越先进站,越后出栈.